アジョブジ星通信

日常系バンザイ。

lxml 奮闘記

f:id:azyobuzin:20120915185805p:plain

前置き

Pythonlxmlとかいうライブラリを使いたいと思ったので、インストールしようとしたら思ったより厄介だったというお話。

とりあえず、要約だけ読めばインストールはできます。他は日記。

出会い

img.azyobuzi.netでHTMLの解析に正規表現を使っているのですが、たまに取りこぼすので、HTMLをパースして取り出したいな、ということでググってたら、こんなものを見つけました。

Gentleちゃれんじ Tips -lxmlでhtmlを処理する-

なかなかおもしろそう。

そこで、まずはテスト環境を作るためにWindowsに突っ込んでみることにしました。

easy_install

Pythonのライブラリといったらeasy_installから取得ですよね!というわけで

easy_install lxml

f:id:azyobuzin:20120915185614p:plain
え?は?舐めてんの?

原因を探せ!

まず怪しいと思ったのが

ERROR: 'xslt-config' は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。

のところです。とりあえず「xslt-config windows」でググってみました。

Windows環境へのlxmlのインストールでつまった。 - コロタエンヂニアリング

…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」でググってみたら、バッチリな記事がありました。

Windows環境下でlxml+python(lxmlのバイナリは未使用) - カストリブログ

なぜ気づかなかったし。。

どうやら、PATH ではなく、INCLUDE と LIB に突っ込むみたいですね。

必要なファイルをかき集めろ!

何度も 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 リターンズ

今度こそ
f:id:azyobuzin:20120915201655p:plain
キタ━━━━(゚∀゚)━━━━!!

早速実験

f:id:azyobuzin:20120915202220p:plain…は?

というわけでもう一度 Windows環境下でlxml+python(lxmlのバイナリは未使用) - カストリブログ をよく読んでみると

ImportError:DLL load failedというエラーメッセージが出力される場合

 先ほど導入したライブラリのdll(「my/bin」にあります)がpythonから見えていないことが原因です。環境変数PATHに「my/bin」を追加していてもエラーになります。

対処法は以下の3つです。

  1. python.exeと同一フォルダに「my/bin」内のdllを置く
  2. 「pythonのインストール場所/Scripts」内のdllを置く
  3. 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