PythonとAmazonとXMLと

遊んだ。
結局GWはこれだけかよ。

pyamazonとかも考えたが、時間もあることだし自分で書いてみる。

import string
import urllib
import urllib2
from xml.dom.minidom import parse

class Amazon
snip...
    def __createUrl(self, **kwargs):
	params = ["&AWSAccessKeyId=%s" % self.accesskey]
	for key, value in kwargs.iteritems():
	    params.append("&%s=%s" % (urllib.quote(key), urllib.quote(value.encode('utf-8'))))

	url = self.baseUrl + string.join(params, '')
	return url

    def __request(self, url):
	f = urllib2.urlopen(url)
	return parse(f)
snip...

肝はこれだけ。
サービスURLとアクセスキーはコンストラクタで設定。
RESTは楽だなあ。
あとは、APIに合わせてメソッドを作る。
とりあえずどうとでもなるDOMで返してるのだが、ラッパクラスはあったほうが良いか?
今回はxpathを使ってみた。

    <?python from xml import xpath ?>
    <div py:for="item in xpath.Evaluate('//Items/Item', result.documentElement)">
      <a href="new_review?isbn=${xpath.Evaluate('./ASIN/text()', item)[0].nodeValue}">
	${xpath.Evaluate('./ItemAttributes/Title/text()', item)[0].nodeValue}
      </a>
	<img src="${xpath.Evaluate('./MediumImage/URL/text()', item)[0].nodeValue}"/>
    </div>

UTF-8でやってる分には文字コードを気にしなくて良いようだ。

ちなみにxpathは標準ライブラリではなく(DOMとSAXは標準)PyXMLに入っている。
http://pyxml.sourceforge.net/
http://www.python.org/community/sigs/current/xml-sig/