Pregunta

Aquí está un fragmento de un archivo HTML estoy explorando con sopa de Hermosa.

<td width="50%">
    <strong class="sans"><a href="http:/website">Site</a></strong> <br /> 

Me gustaría conseguir el <a href> para cualquier línea que tiene el <strong class="sans"> y que está dentro de un <td width="50%">.

¿Es posible consultar un archivo HTML para aquellos que utilizan múltiples condiciones sopa Hermosa?

¿Fue útil?

Solución

Los mecanismos de búsqueda de BeautifulSoup aceptan una exigible, que los documentos parecen recomendar para su caso: "Si tiene que imponer restricciones complejas o entrelazados en los atributos de una etiqueta, pasar un objeto exigible para el nombre, ...". (Bueno ... que están hablando acerca de los atributos específicamente, pero el consejo refleja un espíritu subyacente a la API BeautifulSoup).

Si desea una sola línea:

soup.findAll(lambda tag: tag.name == 'a' and \
tag.findParent('strong', 'sans') and \
tag.findParent('strong', 'sans').findParent('td', attrs={'width':'50%'}))

He usado un lambda en este ejemplo, pero en la práctica es posible que desee definir una función se puede llamar si tiene varios requisitos encadenados ya que esto lambda tiene que hacer dos findParent('strong', 'sans') llama a evitar la formación de una excepción si una etiqueta no tiene <a> strong padres. Utilizando una función adecuada, se podría hacer la prueba más eficiente.

Otros consejos

>>> BeautifulSoup.BeautifulSoup("""<html><td width="50%">
...     <strong class="sans"><a href="http:/website">Site</a></strong> <br />
... </html>""" )
<html><td width="50%">
<strong class="sans"><a href="http:/website">Site</a></strong> <br />
</td></html>
>>> [ a for a in strong.findAll("a") 
            for strong in tr.findAll("strong", attrs = {"class": "sans"}) 
                for tr in soup.findAll("td", width = "50%")]
[<a href="http:/website">Site</a>]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top