lxml を使って html をフィルタリング
今やっている仕事で、既存のパッケージが出力する HTML ファイルを apache のフィルタ機能を使って書き換えるということをしています。
今までは mod_python の output filter でフィルタを作って正規表現で地道に変換していました。
でも、今回はちょっとパターンで対処するには問題が出そうなので、 HTML をパーサで解析して変換することにしました。
最初にパーサとして使ったのは Beautiful Soup 。ご存知? pure python で書かれたパーサです。 find() とか findAll() で対象となるノードを探して書き換えてましたが、ちょっと速度に問題がありました。
というわけで BeautifulSoupとlxmlの処理速度 - Pythonを学ぶ によると13倍速いらしい lxml に替えてみました。
libxml2 と libxslt が必要だったりとインストールがちょっと面倒だったりしますが、確かに速いです。
実際にノードを探すときは XPath という形式で記述します。
例えば全部の入力フィールドを無効に変換するコードはこんな感じ。
from lxml.html import fromstring
tree = fromstring(html)
for input in tree.xpath('//input'):
input.set('disabled', 'disabled')
全部のチェックボックスをチェックさせたい場合はこんな感じ。
for checkbox in tree.xpath('//input[@type="checkbox"]'):
checkbox.checked = True
hoge クラスの div タグ以下を削除したい場合はこんな感じ。
for div in tree.xpath('//div[@class="hoge"]'):
div.drop_tree()
こんな感じで不要な入力フィールドを無効にしたり、要素を削除したりしました。
XPath を駆使するともっと細かい条件指定とかもできるのでかなり便利です。
最初に Xpath を見たときは「なんだこの呪文は!!」と思いましたが、案外便利でいい感じです。 lxml をインストールするのが面倒じゃないときは、こちらを使用することを 強く お勧めします。
ただ、「定期的に裏で動く処理だから速度はどーでもいいや」って時は、 Beautiful Soup でもいいのかなと思います。お好みでどうぞ。
お天気フィルタを lxml バージョンに書き換えよう、そうしよう。
- カテゴリ
-
python
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/1108/tbping
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。
zope/plone関係の技術的な内容については