2009-10-01 20 views
10

Ich versuche BeautifulSoup zu verwenden, um einen DOM-Baum zu analysieren und die Namen der Autoren zu extrahieren. Im Folgenden finden Sie ein HTML-Snippet, das die Struktur des Codes zeigt, den ich scrappen werde.Analysieren von Daten mit BeautifulSoup in 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> 

Mein Punkt der Verwirrung ist, dass, wenn ich soup.find tun, ist es das erste Vorkommen der div-Tags findet, Ich suche. Danach suche ich nach allen 'a' Link Tags. Wie extrahiere ich in diesem Stadium die Namen der Autoren aus den einzelnen Link-Tags und drucke sie aus? Gibt es eine Möglichkeit, dies mit BeautifulSoup zu tun oder muss ich Regex verwenden? Wie fahre ich fort, über jedes andere div-Tag zu iterieren und die Namen der Autoren zu extrahieren?

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' 

Antwort

12

verwenden nur findAll für die divs Link, den Sie tun, für die Links

für authordiv in soup.findAll ('div', attrs = { 'Klasse': 'list-Autoren'}):

1

Da link bereits von einem iterable genommen wird, brauchen Sie nicht link auf Subindex - man muss nur link.contents[0] tun können.

print link.contents[0] mit Ihrem neuen Beispiel mit zwei getrennten <div class="list-authors"> ergibt:

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

Also ich bin nicht sicher, ob ich den Kommentar über die Suche andere divs verstehen. Wenn es sich um verschiedene Klassen handelt, müssen Sie entweder soup.find und soup.findAll oder ändern Sie einfach Ihre erste soup.find.

+1

Und Wenn es mehr div-Tags gibt, wie übertrage ich diese? – GobiasKoffi

+0

Wenn Sie nach CSS-Klasse suchen, erhalten Sie eine Liste von Elementen und Sie können mit einer for-Schleife iterieren (siehe: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css- Klasse). Tun Sie etwas wie: 'authordiv = soup.find ('div', class_ = 'list-authors')'. – eNord9

Verwandte Themen