解析MWS Boto响应时出错

时间:2018-06-02 13:28:52

标签: python python-3.x amazon-web-services boto amazon-mws

使用boto,可以非常轻松地解析使用boto.mws.connectionlist_orders检索的数据,并隔离特定的数据,例如订单号:

from boto.mws.connection import MWSConnection

merchantId = 'XXXXXXXXXXX' 
marketplaceId = 'XXXXXXXXXXX' 
accessKeyId = 'XXXXXXXXXXX' 
secretKey = 'XXXXXXXXXXX' 

mws = MWSConnection(accessKeyId, secretKey, Merchant=merchantId) 

# ListMatchingProducts
a = mws.list_orders(CreatedAfter='2018-05-24T12:00:00Z', MarketplaceId = [marketplaceId])
# retrieve order number within parsed response
a_orderid = a.ListOrdersResult.Orders.Order[0].AmazonOrderId
print(a_orderid)

输出亚马逊订单号:

123-456789-123456

相反,如果想要使用get_matching_product_for_id操作解析和隔离特定数据,可以说获取特定EAN产品ID的相应ASIN:

# GetMatchingProductForId (retrieving product info using EAN code)
b = mws.get_matching_product_for_id(MarketplaceId=marketplaceId,IdType="EAN",IdList=["5705260045710"])
# retrieve ASIN for product within result
b_asin = b.GetMatchingProductForIdResult.Products.Product.MarketplaceASIN

抛出以下错误:

Traceback (most recent call last):
  File "C:\Users\alexa\Desktop\API_Amazon_get_matching_product_for_id.py", line 20, in <module>
    b_asin = b.GetMatchingProductForIdResult.Products.Product.MarketplaceASIN
AttributeError: 'list' object has no attribute 'Products'

任何人都可以找出原因吗?或者有更好的方法来解析boto.mws.connection个回复吗?

2 个答案:

答案 0 :(得分:1)

答案在你的错误信息中。我暂时没有使用过boto但是甚至没有尝试运行你的例子你可以告诉问题在这里:

b_asin = b.GetMatchingProductForIdResult.Products.Product.MarketplaceASIN

错误说:

AttributeError: 'list' object has no attribute 'Products'

向后工作我们可以告诉python正在尝试访问名为Products的属性,但该对象是一个列表。

所以b.GetMatchingProductForIdResult是一个列表。试试print,看看你得到了什么。迭代它并打印元素或打印第一个元素的目录以查看每个元素的属性。

print(dir(b.GetMatchingProductForIdResult[0]))

Traceback是你的朋友,学习它,爱它,活着它。

特别是MWS:

Amazon提供了一个描述响应found here的xsd文件。这应该告诉你你正在处理什么。更一般地说,它描述了元素here

答案 1 :(得分:0)

@Verbal_Kint指出,解决方案就在答案中。使用上面的示例,可以通过挖掘树并在需要时将属性视为列表来检索ASIN。我还没有弄明白为什么有些属性是列表而有些属性不是,但在这个阶段,快速的试验和错误使我找到了解决方案:

b_asin = b.GetMatchingProductForIdResult[0].Products.Product[0].Identifiers.MarketplaceASIN.ASIN
print(b_asin)