パーソナルツール
現在の場所: ホーム takalog
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
« 2009June »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
このBlogについて
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。 zope/plone関係の技術的な内容については http://takanory.net の方にまとめていこうと思います。 コメント・ツッコミはご自由にどうぞ。
twitter facebook linkedin foursquare
カテゴリ
android (16)
av (27)
books (35)
coreblog (49)
ds (22)
ferret (24)
google (34)
icecream (44)
lego (69)
mac (20)
misc (74)
moblog (277)
movie (32)
pc (44)
plone (337)
puzzle (42)
python (56)
server (67)
snowscoot (9)
software (126)
sports (32)
suidou (30)
winds (47)
 
文書操作

lxml を使って html をフィルタリング

作成者 takanori投稿日 2009年06月16日 23時56分 最終変更日時 2009年06月16日 23時59分

今やっている仕事で、既存のパッケージが出力する HTML ファイルを apache のフィルタ機能を使って書き換えるということをしています。

今までは mod_pythonoutput filter でフィルタを作って正規表現で地道に変換していました。

でも、今回はちょっとパターンで対処するには問題が出そうなので、 HTML をパーサで解析して変換することにしました。

最初にパーサとして使ったのは Beautiful Soup 。ご存知? pure python で書かれたパーサです。 find() とか findAll() で対象となるノードを探して書き換えてましたが、ちょっと速度に問題がありました。

というわけで BeautifulSoupとlxmlの処理速度 - Pythonを学ぶ によると13倍速いらしい lxml に替えてみました。

libxml2libxslt が必要だったりとインストールがちょっと面倒だったりしますが、確かに速いです。

実際にノードを探すときは 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 python
トラックバック用URL:
http://takanory.net/takalog/1108/tbping

Powered by vine linux, python, zope, plone, coreblog