lxml 奮闘記
出会い
img.azyobuzi.netでHTMLの解析に正規表現を使っているのですが、たまに取りこぼすので、HTMLをパースして取り出したいな、ということでググってたら、こんなものを見つけました。
なかなかおもしろそう。
そこで、まずはテスト環境を作るためにWindowsに突っ込んでみることにしました。
原因を探せ!
まず怪しいと思ったのが
ERROR: 'xslt-config' は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
のところです。とりあえず「xslt-config windows」でググってみました。
…3.0alpha2 にはインストーラないね。。
とりあえず公式ドキュメントを読んでみよう
you should install a binary distribution of libxml2 and libxslt. You need both libxml2 and libxslt, as well as iconv and zlib.
Installing lxml
libxml2 と libxslt、あと依存関係上 iconv と zlib が必要らしいです。なのでドキュメントに書いてあるところからダウンロードして bin にPATH通してみましたが、状況変わらず。。
原因を探せ! 2
とりあえず「lxml windows」でググってみたら、バッチリな記事がありました。
なぜ気づかなかったし。。
どうやら、PATH ではなく、INCLUDE と LIB に突っ込むみたいですね。
余談:あとから読んで気づいたのですが、「libxml/xmlversion.hが見つかりませんというエラーメッセージが出た場合」ってちゃんと書いてありましたね。エラーメッセージそのまんまじゃなかったので気づきませんでした。。
必要なファイルをかき集めろ!
何度も easy_install lxml-3.0alpha2.tar.gz
を実行して、適切なパスを割り出しました。
準備
まず、ファイルをまとめるためのフォルダを用意します。僕の場合、 C:\libxml とか作って、 INCLIUDE と LIB にそのパスを突っ込みました。
ディレクトリ構成
- libexslt ディレクトリ
- libxslt内の include\libexslt の中身
- libxslt ディレクトリ
- libxslt内の include\libxslt の中身
- libxml ディレクトリ
- libxml2内の include\libxml の中身
- iconv.h
- iconv内の include\iconv.h
- iconv.lib
- iconv内の lib\iconv.lib
- libexslt.lib
- libxslt内の lib\libexslt.lib
- libxslt.lib
- libxslt内の lib\libxslt.lib
- libxml2.lib
- libxml2内の lib\libxml2.lib
- zlib.lib
- zlib内の lib\zlib.lib
easy_install リターンズ
今度こそ
キタ━━━━(゚∀゚)━━━━!!
早速実験
…は?
というわけでもう一度 Windows環境下でlxml+python(lxmlのバイナリは未使用) - カストリブログ をよく読んでみると
ImportError:DLL load failedというエラーメッセージが出力される場合
先ほど導入したライブラリのdll(「my/bin」にあります)がpythonから見えていないことが原因です。環境変数PATHに「my/bin」を追加していてもエラーになります。
対処法は以下の3つです。
- python.exeと同一フォルダに「my/bin」内のdllを置く
- 「pythonのインストール場所/Scripts」内のdllを置く
- lxmlのファイル群と同一の場所にdllを置く
私の場合は、lxmlのファイル群の場所は「pythonのインストール場所/Lib/site-packages/lxml-2.2.3-py2.6-win32.egg/lxml」でした。
ズバリですね。試しにPATH通しただけで実行してみたのですが、ダメだったので、素直にダウンロードしたZIPの中からDLLを探してコピーしましょう。
これで、lxml.htmlに関してはバッチリ動きました。 get_element_by_id() の挙動がよくわからないのはこれから検証していくとして、とりあえず環境ができたので、開発捗ります!
あとは、coreserverに簡単に入れられればいいのですが…。
要約
必要なファイルをかき集めろ! の通りにファイルを配置して、
easy_install lxml
を実行。
lxmlのディレクトリ(Python27\Lib\site-packages\lxml-3.0alpha2-py2.7-win32.egg\lxml とか)に iconv.dll、libexslt.dll、libxslt.dll、libxml2.dll、zlib1.dll を突っ込めばOK