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".*")})