亚马逊 MWS Boto 已解析 XML 个缺失值
Amazon MWS Boto parsed XML missing values
博托 2.40,Python3.5
查询亚马逊 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>
然而只有 Any
值被 Boto 保留:
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')]
)
)
博托 2.40,Python3.5
查询亚马逊 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>
然而只有 Any
值被 Boto 保留:
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')]
)
)