Python ElementTree でAmazon APIを利用する

この間、SAXパーサーでAmazon Product(以下略)を解析したので、更なるXML柔軟利用を目指してXPathを使ってみる。

Amazon APIへのRESTリクエスト作成はこちら。また、最新のソースはこのあたり

ElementTree 参考URL

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で走らせた結果

py_xpath01

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

前の記事

初めてのPython