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)
抽出できた。結果は省略する。著作権うんたらで。
気になる点
<p>
単位で改行されていない(というか改行が1つもない)<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
で気になる点がいくつかある。
<p>
単位で改行されていない(というか改行が1つもない)<ruby>
があるときはどうなるのか?
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux