ページ

2010年4月30日

lxmlのメモ

ちょっと、htmlをパースしたくなりました。パースしたものをxpathで操作してみたくなりました。BeautifulSoupを使おうと思ったのですが、googleさんのお告げによるとlxmlらしいです。lxmlってxmlパーサーだとじっちゃんの代から言われていたので、htmlも食べてくれるとは知りませんでした。パッケージを見ると、lxml.htmlモジュールがいます。いけそうな感じです。どれくらい変なhtmlに対応しているかは分かりませんが、この記事によるとBeautifulSoupの13倍速いらしいです。IBMの記事だとlxmlよりcElementTreeの方がさらに高速らしいです。

さて、lxmlを使ってxpathで要素を抽出してみました。



import sys
import codecs
from lxml import etree, html


filename = sys.argv[1]
encoding = sys.argv[2]
print filename
print encoding
fp = codecs.open(filename, encoding=encoding)
content = fp.read()
fp.close()

root = html.fromstring(content)
elems = root.xpath('//div[@id="block_story"]')[0]

fp = open("part.xml", "w")
part = etree.tostring(elems[0], encoding="utf-8")
fp.write(part)
fp.close()
ファイルから読み込んで、文字列のhtmlとしてパースして、xpathで要素を取得して、文字列ににしています。何が難しいかというと、XPathを書くのが難しいです。

0 件のコメント: