python - Amazon MWS Boto 解析 XML 缺失值

标签 python boto amazon-mws

Boto 2.40,Python 3.5

查询 Amazon MWS get_competitive_pricing_for_asin 时,原始 XML 中存在的某些值一旦被 Boto 解析就会丢失。

原始 XML 包含 NumberOfOfferListings 中每个条件的报价数量

<CompetitivePricing>
    <CompetitivePrices>
      <CompetitivePrice belongsToRequester="false" condition="New" subcondition="New">
        <CompetitivePriceId>1</CompetitivePriceId>
        <Price>
          <LandedPrice>
            <CurrencyCode>USD</CurrencyCode>
            <Amount>18.00</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>USD</CurrencyCode>
            <Amount>18.00</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>USD</CurrencyCode>
            <Amount>0.00</Amount>
          </Shipping>
        </Price>
      </CompetitivePrice>
      <CompetitivePrice belongsToRequester="false" condition="Used" subcondition="VeryGood">
        <CompetitivePriceId>2</CompetitivePriceId>
        <Price>
          <LandedPrice>
            <CurrencyCode>USD</CurrencyCode>
            <Amount>100.00</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>USD</CurrencyCode>
            <Amount>100.00</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>USD</CurrencyCode>
            <Amount>0.00</Amount>
          </Shipping>
        </Price>
      </CompetitivePrice>
    </CompetitivePrices>
    <NumberOfOfferListings>
      <OfferListingCount condition="New">109</OfferListingCount>
      <OfferListingCount condition="Collectible">1</OfferListingCount>
      <OfferListingCount condition="Used">51</OfferListingCount>
      <OfferListingCount condition="Any">161</OfferListingCount>
    </NumberOfOfferListings>
  </CompetitivePricing>

但是 Boto 仅保留 Any 值:

    CompetitivePricing{}(
        TradeInValue: None, 
        CompetitivePrices: CompetitivePriceList{}(
            CompetitivePrice: [
                CompetitivePrice{'condition': 'New', 'belongsToRequester': 'false', 'subcondition': 'New'}(
                    CompetitivePriceId: '1', 
                    Price: Price{}(
                        Shipping: USD 0.00, 
                        LandedPrice: USD 18.00, 
                        ListingPrice: USD 18.00
                    )
                ), 
                CompetitivePrice{'condition': 'Used', 'belongsToRequester': 'false', 'subcondition': 'VeryGood'}(
                    CompetitivePriceId: '2', 
                    Price: Price{}(
                        Shipping: USD 0.00, 
                        LandedPrice: USD 100.00, 
                        ListingPrice: USD 100.00
                    )
                )
            ]
        ), 
        NumberOfOfferListings: [''], 
        OfferListingCount: 161{'condition': 'Any'}
    )

请注意,NumberOfOfferListings 在解析的响应中包含一个空字符串,并且仅保存了 XML 中的一个 OfferListingCount 并添加为新属性。

有人知道为什么其他 OfferListingCount 值被删除,或者对如何保留这些值有好的建议吗?

我搜索并阅读了源代码:https://github.com/boto/boto/blob/develop/boto/mws/response.py#L520并且无法弄清楚它在哪里删除了这些值。我已经对多种产品进行了尝试,并得到了相同的结果。

编辑:我尝试过使用猴子补丁CompetitivePricing:

class OfferListingCount(ResponseElement):
    pass


CompetitivePricing.NumberOfOfferListings = Element(OfferListingCount=ElementList(OfferListingCount))

这给了我一个完整的条件列表:

NumberOfOfferListings: ^NumberOfOfferListings^{}(
    OfferListingCount: [
        OfferListingCount{'condition': 'New'}(), 
        OfferListingCount{'condition': 'Collectible'}(), 
        OfferListingCount{'condition': 'Used'}(), 
        OfferListingCount{'condition': 'Any'}()
    ]
)

但是没有值。

如果我使用SimpleList:

class OfferListingCount(ResponseElement):
    pass


CompetitivePricing.NumberOfOfferListings = Element(OfferListingCount=SimpleList(OfferListingCount))

我得到了值,但没有得到条件:

NumberOfOfferListings: ^NumberOfOfferListings^{}(
    OfferListingCount: ['109', '1', '54', '164']
)

很接近

最佳答案

这是我最终想出的猴子补丁:

from boto.mws.response import CompetitivePricing, ElementList, ResponseElement, Element

class OfferListingCount(ResponseElement):
    OfferCount = 0

    def endElement(self, name, value, connection):
        self.OfferCount = value
        super(OfferListingCount, self).endElement(name, value, connection)

CompetitivePricing.NumberOfOfferListings = Element(OfferListingCount=ElementList(OfferListingCount))

这给了我想要的输出:

CompetitivePricing{}(
    NumberOfOfferListings: ^NumberOfOfferListings^{}(
        OfferListingCount: [
            OfferListingCount{'condition': 'New'}(OfferCount: '105'), 
            OfferListingCount{'condition': 'Collectible'}(OfferCount: '2'), 
            OfferListingCount{'condition': 'Used'}(OfferCount: '58'), 
            OfferListingCount{'condition': 'Any'}(OfferCount: '165')]
    )
)

关于python - Amazon MWS Boto 解析 XML 缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902230/

相关文章:

java - 亚马逊 MWS:报告和订单列表之间的区别

python - 计算总月累计订单数

python - 无法使用 cv2.VideoCapture(video_path).set(cv2.CAP_PROP_FPS, new_frame_rate) 更改输入视频的帧速率

python - 从生成器中强制生成一个列表

python - 如何像 Openstack Swift 一样在 Python (Boto lib) 中获取 Amazon S3 存储桶的元数据/ header ?

python - 使用 Boto 将无值插入 DynamoDB

python - 使用 Python 在 SQL 查询(嵌套 Select 语句)中进行算术运算

python - 获取所有可用的存储桶并打印但仅使用存储桶名称

c# - 亚马逊 MWS 的产品 Feed

amazon-mws - 如何使用 Amazon Marketplace Web Service (Amazon MWS) API 更新产品价格