Разбор данных с помощью BeautifulSoup в Python - PullRequest
10 голосов
/ 01 октября 2009

Я пытаюсь использовать BeautifulSoup для анализа дерева DOM и извлечения имен авторов. Ниже приведен фрагмент HTML-кода, демонстрирующий структуру кода, который я собираюсь проанализировать.

<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, он находит первое вхождение тега div, который я ищу. После этого я ищу все теги ссылки «а». На этом этапе, как извлечь имена авторов из каждого тега ссылки и распечатать их? Есть ли способ сделать это с помощью 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'

Ответы [ 2 ]

13 голосов
/ 01 октября 2009

просто используйте findAll для ссылки div, которую вы делаете для ссылок

для authordiv в soup.findAll ('div', attrs = {'class': 'list-авторы'}):

1 голос
/ 01 октября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...