Получение BeautifulSoup, чтобы найти конкретный <p> - PullRequest
4 голосов
/ 26 марта 2010

Я пытаюсь собрать базовый HTML-скребок для различных сайтов научных журналов, в частности, чтобы получить реферат или вводный абзац.

Текущий журнал, над которым я работаю, это Nature, и статью, которую я использовал в качестве образца, можно увидеть по адресу http://www.nature.com/nature/journal/v463/n7284/abs/nature08715.html.

Однако я не могу вытащить реферат с этой страницы. Я ищу все между тегами <p class="lead">...</p>, но не могу понять, как их изолировать. Я думал, что это будет что-то простое, как

from BeautifulSoup import BeautifulSoup
import re
import urllib2

address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
soup = BeautifulSoup(html)

abstract = soup.find('p', attrs={'class' : 'lead'})
print abstract

При использовании Python 2.5, BeautifulSoup 3.0.8, при запуске возвращается «None». У меня нет возможности использовать что-либо еще, что должно быть скомпилировано / установлено (например, lxml). BeautifulSoup запутался, или я?

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Этот html в значительной степени искажен, и xml.dom.minidom не может разобрать, а синтаксический анализ BeautiFulSoup не работает.

Я удалил некоторые <!-- ... --> детали и снова проанализировал с BeautiFulSoup, тогда он кажется лучше и способен работать soup.find('p', attrs={'class' : 'lead'})

Вот код, который я пробовал

>>> html =re.sub(re.compile("<!--.*?-->",re.DOTALL),"",html)
>>>
>>> soup=BeautifulSoup(html)
>>>
>>> soup.find('p', attrs={'class' : 'lead'})
<p class="lead">The class of exotic Jupiter-mass planets that orb  .....
2 голосов
/ 26 марта 2010

вот не BS способ получить реферат.

address="http://www.nature.com/nature/journal/v463/n7284/full/nature08715.html"
html = urllib2.urlopen(address).read()
for para in html.split("</p>"):
    if '<p class="lead">' in para:
        abstract=para.split('<p class="lead">')[1:][0]
        print ' '.join(abstract.split("\n"))
...