You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动