読者です 読者をやめる 読者になる 読者になる

libxml2でのXPathの練習

Python XML

いつまで続くか分からない、libxml2練習帳シリーズ第一回。
pythonでのXML処理というと、今もっとも熱いのはPython2.5の標準ライブラリにも採用されたElementTreeではあるが、個人的にはlibxml2が好み。
libxml2はスピード、機能とも申し分ないが、Pythonバインディング、C-APIともに入門用のドキュメントが少ないのが残念。
ということで、備忘録もかねて、libxml2の簡単な使い方を書いていきたい。
今回はPython&libxml2でのXPathの練習。

>> import libxml2
>> doc = libxml2.parseFile("http://b.hatena.ne.jp/hotentry?mode=rss")

libxml2を使い、はてなブックマークの最新のエントリを読み込む。
libxml2のI/O関連のメソッドはローカルファイルでも、ネットワーク経由でもOKだ。ああ便利。

>> ctx = doc.xpathNewContext()
>> ctx.xpathRegisterNs("rss", "http://purl.org/rss/1.0/")

XPathを評価するためのxpathContextオブジェクトを作り、RSS1.0の名前空間を登録する。
これで準備完了。

nodes = ctx.xpathEvalExpression("//rss:item/rss:title")

XPathを使ってXMLノードを取り出す。
今回はRSSエントリのタイトルだけを取得してみる。

for node in nodes:
    print node.getContent()

取り出したノードを表示する。
以下は完成した超簡易RSSリーダソースコード

# rss.py
import sys
import libxml2

def read_rss(url):
	doc = libxml2.parseFile(url)
	ctx = doc.xpathNewContext()
	ctx.xpathRegisterNs("rss", "http://purl.org/rss/1.0/")
	nodes = ctx.xpathEvalExpression("//rss:item/rss:title")

	for node in nodes:
		print "-", node.getContent()

	ctx.xpathFreeContext()
	doc.freeDoc()

if __name__ == '__main__':
	if len(sys.argv) < 2:
		print "Usage"
		print "python rss.py [url]"
	else:
		read_rss(sys.argv[1])