lxmlでXMLをパースする
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) 柴田 淳 (著)