tutorial scraping from examples español python beautifulsoup

python - scraping - Cómo encontrar etiquetas con solo ciertos atributos-BeautifulSoup



web scraping python español (5)

Como se explica en la documentación de BeutifulSoup

Puedes usar esto:

soup = BeautifulSoup(html) results = soup.findAll("td", {"valign" : "top"})

EDITAR:

Para devolver etiquetas que solo tengan el atributo valign = "top", puede verificar la longitud de la propiedad attrs de la etiqueta:

from BeautifulSoup import BeautifulSoup html = ''<td valign="top">.....</td>/ <td width="580" valign="top">.......</td>/ <td>.....</td>'' soup = BeautifulSoup(html) results = soup.findAll("td", {"valign" : "top"}) for result in results : if len(result.attrs) == 1 : print result

Eso vuelve:

<td valign="top">.....</td>

¿Cómo usaría BeautifulSoup para buscar etiquetas que contengan ÚNICAMENTE los atributos que busco?

Por ejemplo, quiero encontrar todas las etiquetas <td valign="top"> .

El siguiente código: raw_card_data = soup.fetch(''td'', {''valign'':re.compile(''top'')})

obtiene todos los datos que quiero, pero también toma cualquier etiqueta <td> que tenga el atributo valign:top

También probé: raw_card_data = soup.findAll(re.compile(''<td valign="top">'')) y esto no devuelve nada (probablemente debido a mala expresión regular)

Me preguntaba si había una forma en BeautifulSoup de decir "Encontrar <td> etiquetas cuyo único atributo es valign:top "

ACTUALIZAR POR EJEMPLO, si un documento HTML contiene las siguientes etiquetas <td> :

<td valign="top">.....</td><br /> <td width="580" valign="top">.......</td><br /> <td>.....</td><br />

Quisiera solo la primera etiqueta <td> ( <td width="580" valign="top"> ) para devolver


La forma más sencilla de hacerlo es con el nuevo método de select estilo CSS:

soup = BeautifulSoup(html) results = soup.select(''td[valign="top"]'')


Puede usar funciones lambda en findAll como se explica en la documentation . De modo que en su caso, para buscar la etiqueta td con solo valign = "top" use lo siguiente:

td_tag_list = soup.findAll( lambda tag:tag.name == "td" and len(tag.attrs) == 1 and tag["valign"] == "top")


Simplemente páselo como argumento de findAll :

>>> from BeautifulSoup import BeautifulSoup >>> soup = BeautifulSoup(""" ... <html> ... <head><title>My Title!</title></head> ... <body><table> ... <tr><td>First!</td> ... <td valign="top">Second!</td></tr> ... </table></body><html> ... """) >>> >>> soup.findAll(''td'') [<td>First!</td>, <td valign="top">Second!</td>] >>> >>> soup.findAll(''td'', valign=''top'') [<td valign="top">Second!</td>]


si solo quieres buscar con el nombre del atributo con cualquier valor

from bs4 import BeautifulSoup import re soup= BeautifulSoup(html.text,''lxml'') results = soup.findAll("td", {"valign" : re.compile(r".*")})