ふたこもり

2008-10-06

lxmlでXMLをパースする

| 09:00

lxml を使ってItemSearchの結果をパースしてみます。


etree でXMLパースする

from lxml import etree

root = etree.parse(sorce, parser=etree.XMLParser())
print root #=> <lxml.etree._ElementTree object at 0x01292850>

source に指定できるのは、Fileオブジェクト、Fileオブジェクトと同じ read() を持つオブジェクト、ファイル名、URLです。また、オプションなしの etree.XMLParser を使う場合は、parser は省略できます。


文字列からパースする場合は、fromstring() を使います。

xml = response.read()
root = etree.fromstring(xml)

xpath() で要素を取り出す

find*() で要素を取り出すことができるのですが、find*() は "./Items/Item" のような単純な XPath しか指定できないようです。ECS 4.0が返す XML には Namespace があるので、それでは要素を取り出すことができません。


代わりに xpath() を使います。ちなみに xpath() が返す値は全てリストです。

for item in root.xpath("//*[local-name()='Item']"):
    title = item.xpath(".//*[local-name()='Title']")
    print title[0].text
symfony×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 3)
Fast CakePHP (LLフレームワークBOOKS # 4)
Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 2)
最新LLフレームワークエクスプローラ ... 5大フレームワーク徹底攻略
TurboGears×Python (LLフレームワークBOOKS # 1)

namespaces を渡して要素を取り出す

xpath() に namespaces を渡せば、local-name() と書く手間を省けます。

ns = {"n":"http://webservices.amazon.com/AWSECommerceService/2008-04-07"}

まず、prefix(接頭辞)と URI参照の辞書を用意します。URI参照には XML文字列の xmlns= の後にあるURLを使います。


for item in root.xpath("//n:Item", namespaces=ns):
    title = item.xpath(".//n:Title", namespaces=ns)
    print title[0].text

毎回 namespaces を指定するのは面倒なので、デフォルトの namespaces を指定できないか調べてみましたが、分かりませんでした。


属性を取り出す

属性を取り出すには get() を使います。

header = root.xpath("//*[local-name()='Header']")[0]
print "%s => %s" % (header.get("Name"), header.get("Value"))
UserAgent => Python-urllib/2.4

要素名で要素を取り出す

etree の代わりに objectify でパースすると、要素名をドットで繋げて要素を取り出すことができます。xpath() や get() も使えます。

from lxml import objectify

root = objectify.fromstring(xml)

for item in root.Items[0].Item:
    print item.ItemAttributes[0].Title[0].text
    creators = item.xpath(".//*[local-name()='Creator']")
    creators = [ "%s (%s)" % (c.text, c.get("Role")) for c in creators]
    print ", ".join(creators)
symfony×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 3)
森川 穣 (著), 亀本 大地 (著), 田中 正裕 (著) 

Fast CakePHP (LLフレームワークBOOKS # 4)
秋田 真宏 (著) 

Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 2)
藤本 真樹 (著), 一井 崇 (著), 鶴岡 直也 (著), 新井 啓太 (著) 

最新LLフレームワークエクスプローラ ... 5大フレームワーク徹底攻略
Software Design編集部 (編集) 

TurboGears×Python (LLフレームワークBOOKS # 1)
柴田 淳 (著)