Получение BeautifulSoup для поиска конкретного <p>
-
22-09-2019 - |
Вопрос
Я пытаюсь собрать базовый 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 в замешательстве, или это я?
Решение
Этот 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 .....
Другие советы
вот отличный от 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"))