Version 2 (modified by atzm, 18 years ago) (diff) |
---|
PyAmazon
仕様が割ときつい.
基本
以下は amazon.co.jp から「のだめ」を検索した結果を適当に出力する例.
検索キーワードには UTF-8 文字列 (unicode オブジェクトではない) を指定してやる必要がある.
import amazon LOCALE = 'jp' ACCESS_KEY = 'your access key' amazon.setLocale(LOCALE) amazon.setLicense(ACCESS_KEY) data = amazon.searchByBlended(unicode('のだめ', 'euc-jp').encode('utf-8')) for p in data.ProductLine: details = p.ProductInfo.Details for d in details: for key, val in d.__dict__.iteritems(): print '%(key)s: %(val)s' % locals()
データの整合性
変数のあるなし
PyAmazon は内部で Amazon API の XML を呼び出して xml.dom.minidom で解析した後,unmarshal という関数で階層構造に沿ってオブジェクトを作っている.そのため,XML の構造がそのまま Python のオブジェクトに継承されている.
そのせいか,結果によってあったりなかったりする要素があるので,適切なエラー処理を書く必要がある.
data = amazon.searchByBlended(unicode('のだめ', 'euc-jp').encode('utf-8')) d = data.ProductLine[0].ProductInfo.Details[0] d.ProductDescription # AttributeError を引き起こす可能性が高い getattr(d, 'ProductDescription', None) # こちらの方が安全
型の整合性
たとえば Artists.Artist の中身が list になったり str になったりする.ちゃんと処理してやらないとハマる.
ATTRS = ['Authors', 'Artists', 'Tracks'] data = amazon.searchByBlended(unicode('のだめ', 'euc-jp').encode('utf-8')) d = data.ProductLine[2].ProductInfo.Details[0] for attr in ATTRS: print '%s: ' % attr authors = getattr(d, attr, None) if isinstance(authors, amazon.Bag): authors = getattr(authors, attr[:-1], None) if isinstance(authors, list): # リストの場合 for a in authors: print ' %s' % a elif authors is not None: # リストでも None でもない場合は str と仮定 print ' %s' % authors