LoginSignup
7

More than 5 years have passed since last update.

Python で Web ページの本文を抽出する

Posted at

Web ページからテキストを抽出する場合、単純にタグの中のテキストコンテンツを抽出すると、メニューなどの本文ではないテキストも大量に混ざってしまう。

そこで Web ページの中から本文っぽいテキストだけを抽出するために、boilerpipe という Java ライブラリの Python ラッパーを試してみた。

boilerpipe 以外にも Newspaper や Goose といったツールも試してみたが、他のツールは日本語コンテンツに対応していなかったり、Python 3 に対応していなかったりしていてうまくいかなかった。

インストール

pip install boilerpipe だと jar の URL が古くてダウンロードできないので GitHub からインストールする。

$ pip install git+https://github.com/misja/python-boilerpipe

裏で jar を実行しているので、JVM がインストールされている必要がある。

例えば Ubuntu / Debian だったら

# apt install default-jre

こんな感じでインストールしておく。

URL から本文を抽出する

色々な Extractor があるらしいが、本文を抽出するには ArticleExtractor を使う。

from boilerpipe.extract import Extractor

url = 'https://www.buzzfeed.com/jp/kensukeseya/uenozoo1'
extractor = Extractor(extractor='ArticleExtractor', url=url)
print(extractor.getText())

このような出力が得られる。

5月15日時点の体重は 26・6キロ 。永久歯に生え替わりつつあり、10日には固形物を初めて食べたといいます。
そんなシャンシャンが1歳になるにあたり、上野動物園はさまざまな企画を用意しています。
1歳を記念して、6月12日から17日まで、シャンシャンの写真を使った記念カードの配布、「シャンシャン1歳記念限定メニュー」としてうどんやパンナコッタの販売などをする予定です。
誕生日当日に来園できなくてもお祝いしたいですね

実際のページを見て比較してみると、取りこぼしが多くあまりちゃんと取得できていないが、いったん目を瞑る・・・。

HTML 文字列から本文を抽出する

url オプションの代わりに html オプションに文字列を指定する。

from boilerpipe.extract import Extractor

# 何らかの別の手法で HTML テキストを取得
url = 'https://www.buzzfeed.com/jp/kensukeseya/uenozoo1'
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
    html = res.read()

extractor = Extractor(extractor='ArticleExtractor', html=html)
print(extractor.getText())

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7