BeautifulSoup を取得して特定の <p> を見つけます
-
22-09-2019 - |
質問
私は、さまざまな科学雑誌 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 は混乱していますか、それとも私ですか?
解決
その 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"))
所属していません StackOverflow