やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

HTMLから本文テキストだけを抽出したい(python-extractcontent)

 Webスクレイピングの一種。

成果物

情報源

python-extractcontent

 HTML本文抽出パッケージをインストールする。

pip3 install extractcontent3

 テスト用HTMLを入手する。

wget -O index.html 適当なニュースサイトURL

 コードを書く。

run.py

import sys
import os
import extractcontent3

print(extractcontent3.__file__)
if len(sys.argv) < 1:
    raise Error('第1引数にHTMLファイルパスを指定してください。')
    exit()
if not os.path.isfile(sys.argv[0]): 
    raise Error('第1引数HTMLファイルパスが存在しません。:'+sys.argv[0])
    exit()

extractor = extractcontent3.ExtractContent()
print(dir(extractor ))

opt = {"threshold":50}
extractor.set_option(opt)

html = open("index.html").read()
extractor.analyse(html)
text, title = extractor.as_text()
html, title = extractor.as_html()
title = extractor.extract_title(html)

print(title)
print(text)
print(html)

 抽出できた。結果は省略する。著作権うんたらで。

気になる点

  1. <p>単位で改行されていない(というか改行が1つもない)
  2. <ruby>があるときはどうなるのか?

ruby

ruby 結果
<ruby>漢字<rp>(</rp><rt>かんじ</rt><rp>)</rp></ruby> 漢字(かんじ)
<ruby>漢<rp>(</rp><rt>かん</rt><rp>)</rp>字<rp>(</rp><rt>じ</rt><rp>)</rp></ruby> 漢(かん)字(じ)
<ruby>漢<rt>かん</rt>字<rt>じ</rt></ruby> 漢かん字じ
<ruby>漢字<rt>かんじ</rt></ruby> 漢字かんじ

試行錯誤

試行錯誤

python-extractcontentインストール

 python-extractcontentを使ってみる。

 まずは探す。

pip3 search extractcontent
extractcontent3 (0.0.2)  - ExtractContent for Python 3

 インストールする。

pip3 install extractcontent

 エラー。だめだ。そういえばpythonは環境構築が超絶に大変だった記憶がある。勘弁。

Collecting extractcontent
  Could not find a version that satisfies the requirement extractcontent (from versions: )
No matching distribution found for extractcontent

 githubからソースを入手。

git clone https://github.com/yono/python-extractcontent

 extractcontent.pyファイルを同じ階層に置く。

python3 run.py
Traceback (most recent call last):
  File "run.py", line 3, in <module>
    import extractcontent
  File "/tmp/work/1/extractcontent.py", line 124
    print "----- %f*%f=%f %d \n%s" %\
                                 ^
SyntaxError: Missing parentheses in call to 'print'

 ああ、python3でなくpython2でないと動かないのね。インストールできなかったのもそのせいか? ならpip3で検索ヒットするのやめてくれない? と思ったが、よくみてみるとpip3 serchの結果はextractcontent3という名前だった。末尾に3がついてた。

pip3 install extractcontent3
Collecting extractcontent3
  Downloading https://www.piwheels.org/simple/extractcontent3/extractcontent3-0.0.2-py3-none-any.whl
Installing collected packages: extractcontent3
Successfully installed extractcontent3-0.0.2

 インストールできた。

コードを書く

 だが、実行するとimport extractcontentなんてねーよと怒られる。

ImportError: No module named 'extractcontent'

 import extractcontent3にする。以下エラー。

AttributeError: 'ExtractContent' object has no attribute 'set_default'

 なら、何ならいいのよ? ソースコードを見たい。以下コードで。

import extractcontent3
print(extractcontent3.__file__)
extractor = extractcontent3.ExtractContent()
print(dir(extractor ))
/home/pi/.local/lib/python3.5/site-packages/extractcontent3/__init__.py
['CHARREF', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_count_pattern', '_eliminate_link', '_eliminate_useless_tags', '_estimate_title', '_evaluate_list', '_has_only_tags', '_islinklist', '_split_to_blocks', '_strip_tags', 'analyse', 'as_html', 'as_text', 'body', 'extract_title', 'option', 'set_option', 'title']

 set_optionが正しそう。というわけでコードは以下。

import sys
import os
import extractcontent3

print(extractcontent3.__file__)
if len(sys.argv) < 1:
    raise Error('第1引数にHTMLファイルパスを指定してください。')
    exit()
if not os.path.isfile(sys.argv[0]): 
    raise Error('第1引数HTMLファイルパスが存在しません。:'+sys.argv[0])
    exit()

extractor = extractcontent3.ExtractContent()
print(dir(extractor ))

opt = {"threshold":50}
#extractor.set_default(opt)
extractor.set_option(opt)

html = open("index.html").read() # 解析対象HTML
extractor.analyse(html)
text, title = extractor.as_text()
html, title = extractor.as_html()
title = extractor.extract_title(html)

print(title)
print(text)
print(html)

 たかが動作確認するだけでこれほど苦労するのがPythonクオリティー。なつかしいこのイライラ感覚。Pythonに帰ってきた感。

結果をみる

 textが取得できた。htmlと比較してみると、<p>タグ内のテキストノードだけを抽出していることがわかる。

 textで気になる点がいくつかある。

  1. <p>単位で改行されていない(というか改行が1つもない)
  2. <ruby>があるときはどうなるのか?

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで