2009-06-29 22 views

Respuesta

19

De acuerdo con los documentos, primero hacer un árbol de análisis:

import BeautifulSoup 
html = "<html><body><tr><td><a href='foo'/></td></tr></body></html>" 
soup = BeautifulSoup.BeautifulSoup(html) 

y luego buscar en ella, por ejemplo, para <a> etiquetas cuyos padres inmediata es una <td>:

for ana in soup.findAll('a'): 
    if ana.parent.name == 'td': 
    print ana["href"] 
+0

lamentablemente no funciona – Greyshack

+3

@Greyshack, funciona bien para mí (usando la versión actual, por supuesto, más de 6 años después de la publicación original - pip instalar beautifulsoup4, y luego, por supuesto, el nombre del módulo es ahora bs4) - print 'foo' , según sea necesario. Por supuesto, es imposible ofrecerle ayuda en función de una descripción tan vaga de su problema como "no funciona [sic]". –

19

Algo como esto?

from BeautifulSoup import BeautifulSoup 
soup = BeautifulSoup(html) 
anchors = [td.find('a') for td in soup.findAll('td')] 

Eso debería encontrar la primera "a" dentro de cada "TD" en el HTML que proporcionan. Se pueden ajustar td.find para ser más específicos, o bien utilizar findAll si tiene varios enlaces dentro de cada td.

ACTUALIZACIÓN: Re comentario de Daniele, si usted quiere asegurarse de que usted no tiene ningún None 's en la lista, entonces usted podría modificar la lista de la comprensión de este modo:

from BeautifulSoup import BeautifulSoup 
soup = BeautifulSoup(html) 
anchors = [a for a in (td.find('a') for td in soup.findAll('td')) if a] 

Lo que básicamente sólo se suma una verifique si tiene un elemento real devuelto por td.find('a').

+0

eso es muy ¡inteligente! pero si 'a' no está presente, ¿incluiría None en la lista de anclas? ¿Cómo puedo completar la lista de anclas solo los 'a' reales que superan a los Nones? –

+1

Ok, he actualizado la pregunta para tratar de eliminar None's de la lista. –

+0

¡eso es genial! ¡Gracias! –

Cuestiones relacionadas