Q: lxml vs BeautifulSoup ?
A: BeautifulSoup 4
BeautifulSoup は 4から、lxml をパーザとして指定することができる(参考:python - BeautifulSoup and lxml.html - what to prefer? - Stack Overflow)ので、基本的に BeautifulSoup を介して利用したほうが便利。
soup = BeautifulSoup(html, "lxml")
のようにして使う。デフォのパーザを使いたいときは以下の通り。
soup = BeautifulSoup(html, "html.parser")
lxml は Windows では pip でインストールできない(失敗すると思う)ので、condaかwheelでインストール(参考:minicondaをvirtualenvと組み合わせて使う - Drafts)。
こういう外部のライブラリを使ったときは requirements.txt
に書かなければならない(参考:morph.io: How to use any library in your scraper)。書式は pip freeze
の出力と同じ。必要なライブラリを把握するためにも venv は必須(参考:Python 3.3 以降の venv - Drafts)
その他参考:
- PythonとBeautiful Soupでスクレイピング - Qiita
- windows 向けバイナリパッケージを wheel フォーマットに変換する - Qiita wheel でも
... is not a supported wheel on this platform.
と言われて失敗することがある。 - lxml を使用して Python での XML 構文解析をハイパフォーマンスにする lxml の良さの一つに高速さがある。
Q: scraperwiki ライブラリを使うべきか?
A: No, in python. No, in Node.js neither.
scraperwiki 0.5.1 : Python Package Indexはgithubでソースが管理されているが開発が活発ではない。また、サービス用にカスタマイズしたブランチを使うようにmorph.ioのドキュメントに指示されているが、こちらはさらにメインのライブラリへの追随が遅れている。また、それぞれのコード量は対して多いわけでもなく、独自のインタフェース(それ自体は洗練されていて使いやすい)を覚えるのに必要な労力と見合わないと感じた。また、本家の方を使ってmorph用にデータベース名を「data.sqlite」にしようとすると環境変数を介す必要があり、os.environ で書き換えても駄目だったので、面倒だ。デフォは「scraperwiki.sqlite」になっている。scraperwiki.com 時代の名残だろうか。
そこで、scraperwikiライブラリのソースコードを参考にしつつコード部分はコピペでもいいので直接書いたほうが良い。
- scraperwiki-python/sql.py at master · scraperwiki/scraperwiki-python
- iPhoneでSQLite3を使う12(INSERT OR REPLACE文) - 黒色槍騎兵のiPhoneアプリ開発日記
みたいなのを参考に INSERT OR REPLACE INTO ...
をコードに組み込んだり、まあ勉強にもなるし。
そして、ドキュメントの Node.js 欄や morph.io: drzax/morph-hansard のような例を見ても Node.js の場合は一般的なライブラリを使っている。それで十分じゃないかな。
その他参考:
- Documentation / First scraper tutorial | ScraperWiki 昔の ScraperWiki の方のドキュメント。