5

私は、さまざまな科学雑誌の Web サイト用の基本的な HTML スクレーパーをまとめようとしています。具体的には、要約または紹介の段落を取得しようとしています。

私が現在取り組んでいるジャーナルは Nature で、サンプルとして使用している記事は次の URL で見ることができます。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 は混乱していますか、それとも私ですか?

4

2 に答える 2

5

その 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  .....
于 2010-03-26T07:51:00.290 に答える
2

これは、アブストラクトを取得する非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"))
于 2010-03-26T08:03:01.783 に答える