Python ElementTree でAmazon APIを利用する
この間、SAXパーサーでAmazon Product(以下略)を解析したので、更なるXML柔軟利用を目指してXPathを使ってみる。
Amazon APIへのRESTリクエスト作成はこちら。また、最新のソースはこのあたりを
ElementTree 参考URL
- http://pythonjp.sourceforge.jp/dev/library/xml.etree.elementtree.html
- http://www.python.org/doc/current/library/xml.etree.elementtree.html
- http://www.python.jp/doc/release/lib/module-xml.etree.ElementTree.html
XPath の構文
注意点
- xmlns属性があると、タグを指定するときに、’//tag_name’ などと書くことができずに、’//{http://xmlns_attribute_value}tag_name’のようにいちいち記述する必要がある。
- 要するに、elm.find(‘./ItemAttributes/Title’) と書くことはできず、elm.find(‘./{http://webservices.amazon.com/AWSECommerceService/2005-10-05}ItemAttributes/{http://webservices.amazon.com/AWSECommerceService/2005-10-05}Title のようにする必要がある’)
- #!Python2.6
- # -*- coding: utf-8 -*-
- import amazon_ecs # 自作モジュールをインポート
- import urllib2
- from xml.etree import ElementTree
- # xmlns を付加したタグ名を返す
- def qn(tag):
- return ElementTree.QName(ns, tag).text
- ns = r'http://webservices.amazon.com/AWSECommerceService/2005-10-05'
- # xmlnsが指定されている場合、タグを{xmlnsの値}タグ名 といちいち書く必要があるため、そのように展開したものを保持しておく
- # ./{http://webservices.amazon.com/AWSECommerceService/2005-10-05}ItemAttributes/{http://webservices.amazon.com/AWSECommerceService/2005-10-05}Title
- q_items = './/{0}'.format(qn('Item'))
- q_title = './{0}/{1}'.format(qn('ItemAttributes'), qn('Title'))
- q_author = './{0}/{1}'.format(qn('ItemAttributes'), qn('Author'))
- q_asin = './{0}'.format(qn('ASIN'))
- q_url = './{0}'.format(qn('DetailPageURL'))
- q_img = './{0}/{1}'.format(qn('SmallImage'), qn('URL'))
- # Amazon Product Advertise API リクエスト URLを生成
- operation = amazon_ecs.ItemSearch()
- operation.keywords('手塚 治虫')
- operation.search_index('Books')
- operation.response_group('Large')
- request = operation.request()
- print 'REQUEST : {0}'.format(request)
- # ElementTreeを生成
- root = ElementTree.parse(urllib2.urlopen(request)).getroot()
- # XPathを使用してElementTreeを解析
- items = root.findall(q_items)
- for item in items:
- print '-' * 100
- print 'TITLE : {0}'.format(item.find(q_title).text)
- print 'AUTHOR : {0}'.format(item.find(q_author).text)
- print 'ASIN : {0}'.format(item.find(q_asin).text)
- print 'URL : {0}'.format(item.find(q_url).text)
- print 'IMG : {0}'.format(item.find(q_img).text)
PyDevで走らせた結果