Consulta compleja sopa hermosa

Aquí hay un fragmento de un archivo HTML que estoy explorando con Beautiful Soup.

 Site 

Me gustaría obtener para cualquier línea que tenga y que esté dentro de

.

¿Es posible consultar un archivo HTML para esas múltiples condiciones usando Beautiful Soup?

Los mecanismos de búsqueda de BeautifulSoup aceptan una llamada, que los documentos parecen recomendar para su caso: “Si necesita imponer restricciones complejas o entrelazadas en los atributos de una etiqueta, pase un objeto que pueda llamarse por su nombre, …”. (ok … están hablando de atributos específicamente, pero el consejo refleja un espíritu subyacente de la API de BeautifulSoup).

Si quieres 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 que se pueda findParent('strong', 'sans') si tiene varios requisitos encadenados, ya que este lambda debe realizar dos findParent('strong', 'sans') para evitar una excepción. si una etiqueta no tiene un padre strong . Usando una función adecuada, podría hacer la prueba más eficiente.

 >>> BeautifulSoup.BeautifulSoup(""" ... Site 
... """ ) Site
>>> [ a for a in strong.findAll("a") for strong in tr.findAll("strong", attrs = {"class": "sans"}) for tr in soup.findAll("td", width = "50%")] [Site]