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())