2009-10-01 4 views
10

Я пытаюсь использовать BeautifulSoup для анализа через дерево DOM и извлечения имен авторов. Ниже приведен фрагмент HTML, чтобы показать структуру кода, который я собираюсь очистить.Разбор данных с использованием BeautifulSoup в 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> 

Моя точка путаницы в том, что, когда я soup.find, находит первое вхождение сНу тег, который я найти. После этого я ищу все теги ссылок «a». На этом этапе, как мне извлечь имена авторов из каждого тега ссылки и распечатать их? Есть ли способ сделать это с помощью BeautifulSoup или мне нужно использовать Regex? Как продолжить итерацию по всем другим тегам div и извлечь имена авторов?

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' 

ответ

12

просто использовать FindAll для дивы ссылки вы делаете для ссылок

для authordiv в soup.findAll ('DIV', ATTRS = { 'класс': 'список-авторов'}):

1

Поскольку link уже взяты из итератора, вам не нужно Subindex link - вы можете просто сделать link.contents[0].

print link.contents[0] с новым примером с двумя отдельными выходами <div class="list-authors">:

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

Так что я не уверен, что понял комментарий о поиске других дивы. Если это разные классы, вам нужно либо сделать отдельный soup.find, либо soup.findAll, либо просто изменить свой первый soup.find.

+1

И если есть больше тегов div, как мне перебирать эти теги? – GobiasKoffi

+0

Если вы выполняете поиск по классу CSS, вы получаете список элементов, и вы можете перебирать цикл for (см. Http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-by-css- класс). Сделайте что-то вроде: 'authordiv = soup.find ('div', class_ = 'list-authors')'. – eNord9

Смежные вопросы