wiki:PyAmazon

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