2009-10-01 23 views
10

Estoy intentando usar BeautifulSoup para analizar a través de un árbol DOM y extraer los nombres de los autores. A continuación se muestra un fragmento de HTML para mostrar la estructura del código que voy a raspar.Analizando datos usando BeautifulSoup en Python

<html> 
<body> 
<div class="list-authors"> 
<span class="descriptor">Authors:</span> 
<a href="/find/astro-ph/1/au:+Lin_D/0/1/0/all/0/1">Dacheng Lin</a>, 
<a href="/find/astro-ph/1/au:+Remillard_R/0/1/0/all/0/1">Ronald A. Remillard</a>, 
<a href="/find/astro-ph/1/au:+Homan_J/0/1/0/all/0/1">Jeroen Homan</a> 
</div> 
<div class="list-authors"> 
<span class="descriptor">Authors:</span> 
<a href="/find/astro-ph/1/au:+Kosovichev_A/0/1/0/all/0/1">A.G. Kosovichev</a> 
</div> 

<!--There are many other div tags with this structure--> 
</body> 
</html> 

Mi punto de confusión es que cuando lo haga soup.find, se encuentra la primera aparición de la etiqueta div que estoy buscando. Después de eso, busco todas las etiquetas de enlace 'a'. En esta etapa, ¿cómo extraigo los nombres de los autores de cada una de las etiquetas de enlace y las imprimo? ¿Hay alguna manera de hacerlo usando BeautifulSoup o necesito usar Regex? ¿Cómo continúo iterando sobre cualquier otra etiqueta div y extraigo los nombres de los autores?

import re 
import urllib2,sys 
from BeautifulSoup import BeautifulSoup, NavigableString 
html = urllib2.urlopen(address).read() 
    soup = BeautifulSoup(html) 

    try: 

     authordiv = soup.find('div', attrs={'class': 'list-authors'}) 
     links=tds.findAll('a') 


     for link in links: 
      print ''.join(link[0].contents) 

     #Iterate through entire page and print authors 


    except IOError: 
     print 'IO error' 

Respuesta

12

sólo tiene que utilizar findAll para vincular los divs que hacen por los enlaces

para authordiv en soup.findAll ('div', attrs = { 'clase': 'list-autores}):

1

Desde link ya se ha tomado de un iterable, que no es necesario subíndice link - sólo puede hacer link.contents[0].

print link.contents[0] con su nuevo ejemplo con dos <div class="list-authors"> rendimientos separadas:

Dacheng Lin 
Ronald A. Remillard 
Jeroen Homan 
A.G. Kosovichev 

así que no estoy seguro de entender el comentario acerca de búsquedas en otros divs. Si son clases diferentes, deberá hacer un soup.find y soup.findAll por separado, o simplemente modificar su primer soup.find.

+1

Y si hay más etiquetas div, ¿cómo puedo iterar sobre esas? – GobiasKoffi

+0

Si busca por clase CSS, obtiene una lista de elementos y puede iterar con un ciclo for (ver: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css- clase). Haga algo como: 'authordiv = soup.find ('div', class_ = 'list-authors')'. – eNord9

Cuestiones relacionadas