2009-10-01 26 views
10

J'essaie d'utiliser BeautifulSoup pour analyser une arborescence DOM et extraire les noms des auteurs. Ci-dessous un extrait de code HTML pour montrer la structure du code que je vais gratter.Analyse des données à l'aide de 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> 

Mon point de confusion est que quand je fais soup.find, il trouve la première occurrence de la balise div que je recherche. Après cela, je recherche tous les balises de liens 'a'. A ce stade, comment puis-je extraire les noms des auteurs de chacune des balises et les imprimer? Y at-il un moyen de le faire en utilisant BeautifulSoup ou dois-je utiliser Regex? Comment continuer à itérer sur tous les autres balises div et extraire les noms des auteurs?

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' 

Répondre

12

utiliser juste findAll pour les divs lien que vous faites pour les liens

pour authordiv dans soup.findAll ('div', attrs = { 'classe': 'liste-auteurs'}):

1

Depuis link est déjà pris d'un itératives, vous ne avez pas besoin de sous-index link - vous pouvez juste faire link.contents[0].

print link.contents[0] avec votre nouvel exemple avec deux <div class="list-authors"> séparés, on obtient:

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

Je ne suis pas sûr que je comprends le commentaire sur la recherche d'autres divs. Si ce sont des classes différentes, vous devrez soit faire un soup.find et soup.findAll séparé, ou simplement modifier votre premier soup.find.

+1

Et s'il y a plus de balises div, comment puis-je itérer sur celles-ci? – GobiasKoffi

+0

Si vous effectuez une recherche par classe CSS, vous obtenez alors une liste d'éléments et vous pouvez itérer avec une boucle for (voir: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css- classe). Faites quelque chose comme: 'authordiv = soup.find ('div', class_ = 'liste-auteurs')'. – eNord9

Questions connexes