¿Cómo podría, usando BeautifulSoup, buscar etiquetas que contengan SOLO los atributos que busco?
Por ejemplo, quiero encontrar todas las <td valign="top">
etiquetas.
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 <td>
etiqueta que tenga el atributovalign:top
También lo intenté:
raw_card_data = soup.findAll(re.compile('<td valign="top">'))
y esto no devuelve nada (probablemente debido a una expresión regular incorrecta)
Me preguntaba si en BeautifulSoup había alguna forma de decir "Buscar <td>
etiquetas cuyo único atributo sea valign:top
"
ACTUALIZAR Por
ejemplo, si un documento HTML contiene las siguientes <td>
etiquetas:
<td valign="top">.....</td><br />
<td width="580" valign="top">.......</td><br />
<td>.....</td><br />
Me gustaría que solo regresara la primera <td>
etiqueta ( <td width="580" valign="top">
)
fuente
<tr>
etiquetas con el atributovalign="top"
, incluidas las que tienen otros atributos (<td width="580" valign="top">
también se devuelve en esta búsqueda) Estoy buscando un método para encontrar<tr>
etiquetas cuyo único atributo seavalign="top"
Puede utilizar
lambda
funcionesfindAll
como se explica en la documentación . De modo que, en su caso, busque unatd
etiqueta con solovalign = "top"
usar lo siguiente:td_tag_list = soup.findAll( lambda tag:tag.name == "td" and len(tag.attrs) == 1 and tag["valign"] == "top")
fuente
si solo desea buscar con nombre de atributo con cualquier valor
from bs4 import BeautifulSoup import re soup= BeautifulSoup(html.text,'lxml') results = soup.findAll("td", {"valign" : re.compile(r".*")})
según Steve Lorimer, es mejor pasar True en lugar de regex
results = soup.findAll("td", {"valign" : True})
fuente
r".*"
, lo que hace que no se compile.True
:results = soup.findAll("td", {"valign" : True})
La forma más sencilla de hacerlo es con el nuevo
select
método de estilo CSS :soup = BeautifulSoup(html) results = soup.select('td[valign="top"]')
fuente
Simplemente páselo como un 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>]
fuente
<td width="580" valign="top">
:? No quiero agarrar esas, solo etiquetas cuyo único atributo esvalign="top"
Al agregar una combinación de la respuesta de Chris Redford y Amr, también puede buscar un nombre de atributo con cualquier valor con el comando de selección:
from bs4 import BeautifulSoup as Soup html = '<td valign="top">.....</td>\ <td width="580" valign="top">.......</td>\ <td>.....</td>' soup = Soup(html, 'lxml') results = soup.select('td[valign]')
fuente