代码之家  ›  专栏  ›  技术社区  ›  Alex B

分析MWS BOTO响应时出错

  •  0
  • Alex B  · 技术社区  · 6 年前

    使用boto,可以非常容易地解析使用 boto.mws.connection list_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.连接 响应?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Verbal_Kint    6 年前

    答案就在你的错误信息里。我已经有一段时间没用过boto了,但即使不试着运行您的示例,您也可以看出问题出在这里:

    b_asin = b.GetMatchingProductForIdResult.Products.Product.MarketplaceASIN
    

    错误显示:

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

    向后看,我们可以看出python正试图访问一个名为 Products 但对象是一个列表。

    所以 b.GetMatchingProductForIdResult 是一个列表。尝试 print 看看你得到了什么。遍历它并打印元素或打印第一个元素的dir以查看每个元素的属性。

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

    回溯是你的朋友,学习它,热爱它,生活它。

    现在特别对MWS说:

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

        2
  •  0
  •   Alex B    6 年前

    答案就在“口头”指出的答案里。使用上面的示例,可以通过挖掘树并在需要时将属性视为列表来检索asin。我还没有完全弄清楚为什么有些属性是列表,而有些属性不是列表,但在现阶段,一个快速的尝试和错误使我能够找到解决方案:

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