如何在Python中搜索Amazon MWS API返回的嵌套字典指定键?
嘿,作为编程新手碰到这种层层嵌套的字典确实头大,我当初刚接触API返回数据的时候也犯过难😅。咱们一步步来拆解这个问题!
先看看你给出的示例数据,我帮你格式化后结构更清晰:
response_dict = { 'Products': { 'Product': { 'AttributeSets': { 'ItemAttributes': { 'Binding': {'value': 'Video Game'}, 'Brand': {'value': 'Nintendo'}, 'Color': {'value': 'blue'}, 'ESRBAgeRating': {'value': 'Everyone'}, 'HardwarePlatform': {'value': 'Android/iOS'}, 'IsAdultProduct': {'value': ...} } } } } }
下面给你三种实用的方法,从基础到进阶,按需选择:
方法1:逐层直接访问(最直观,适合结构固定的场景)
如果确定API返回的结构不会变,直接一层一层“钻”进去就行,就像剥洋葱一样:
# 先定位到ItemAttributes这一层,后续取属性更方便 item_attributes = response_dict['Products']['Product']['AttributeSets']['ItemAttributes'] # 提取你需要的具体字段值 brand = item_attributes['Brand']['value'] color = item_attributes['Color']['value'] age_rating = item_attributes['ESRBAgeRating']['value'] print(f"品牌:{brand},颜色:{color},年龄分级:{age_rating}")
小提示:如果怕某个层级不存在导致报错,可以用字典的get()方法,给每个层级设置默认空字典,这样就算某个节点缺失,代码也不会崩溃:
# 安全版提取,不存在的字段会返回None brand = response_dict.get('Products', {}).get('Product', {}).get('AttributeSets', {}).get('ItemAttributes', {}).get('Brand', {}).get('value')
方法2:递归函数遍历(适合结构不确定,想批量提取的场景)
如果API返回的结构偶尔会有变化,或者你想一次性提取所有value对应的内容,可以写个递归函数自动遍历所有嵌套的字典:
def extract_all_values(data, target_key='value'): results = [] # 判断当前数据是不是字典 if isinstance(data, dict): for key, value in data.items(): if key == target_key: results.append(value) else: # 递归遍历子字典 results.extend(extract_all_values(value, target_key)) return results # 调用函数,提取所有'value'的值 all_values = extract_all_values(response_dict) print(all_values) # 输出:['Video Game', 'Nintendo', 'blue', 'Everyone', 'Android/iOS', ...]
要是只想找特定属性(比如Brand的value),可以把函数改得更针对性:
def extract_specific_attr(data, target_attr, target_key='value'): if isinstance(data, dict): for key, value in data.items(): if key == target_attr: return value.get(target_key) # 递归查找子字典 result = extract_specific_attr(value, target_attr, target_key) if result is not None: return result return None # 提取Brand的value brand = extract_specific_attr(response_dict, 'Brand') print(brand) # 输出:Nintendo
方法3:用第三方工具简化(进阶版,省得自己写代码)
如果你不想手动写递归逻辑,可以试试glom这个第三方库(先通过pip install glom安装),它专门用来处理嵌套数据,语法超级简洁:
from glom import glom # 提取单个字段 brand = glom(response_dict, 'Products.Product.AttributeSets.ItemAttributes.Brand.value') # 一次性提取多个字段,返回一个整洁的字典 target_attrs = glom(response_dict, { 'brand': 'Products.Product.AttributeSets.ItemAttributes.Brand.value', 'color': 'Products.Product.AttributeSets.ItemAttributes.Color.value', 'platform': 'Products.Product.AttributeSets.ItemAttributes.HardwarePlatform.value' }) print(target_attrs) # 输出:{'brand': 'Nintendo', 'color': 'blue', 'platform': 'Android/iOS'}
小提示:如果某个字段可能不存在,还可以设置默认值避免报错:
# 假设Size字段可能不存在,返回默认值'Unknown' size = glom(response_dict, 'Products.Product.AttributeSets.ItemAttributes.Size.value', default='Unknown')
最后提个小建议:Amazon MWS现在已经逐步被SP-API取代了,如果是新项目的话,建议考虑迁移到SP-API哦,不过处理嵌套数据的思路是完全一样的~
内容的提问来源于stack exchange,提问作者Youn Jung Chung




