You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python访问SP-API返回JSON的salesRanks/ranks字段报KeyError求助

问题分析与解决方案

错误原因

  1. 请求字段与访问字段不匹配
    报错代码中,请求API时指定的includedData=["summaries", "ranks"],但后续代码尝试访问payload['salesRanks']字段。如果API仅返回你请求的ranks字段,自然找不到salesRanks,触发KeyError。另外你第一次测试代码里的["summaries, salesRanks"]写法也有问题——这是一个包含单个字符串的数组,正确写法应该是把每个字段作为独立数组元素:["summaries", "salesRanks"]。

  2. 未处理字段缺失的情况
    部分ASIN可能没有销售排名数据,返回的payload中可能不存在salesRanks或ranks,或者对应的数组为空。直接通过下标(比如[0])访问会触发KeyError或IndexError。

  3. 冗余的重复赋值
    代码中'sales_rank_title_1'被连续赋值两次,后一次会覆盖前一次,属于无效代码。


修复后的代码示例

from sp_api.api import CatalogItems
from sp_api.base import Marketplaces

def get_catalog_items(asin_list):
    credentials = {
        'refresh_token': 'X',
        'lwa_app_id': 'XYZY',  
        'lwa_client_secret': 'XYZT',
        'aws_access_key': 'YOUR_AWS_ACCESS_KEY',
        'aws_secret_key': 'YOUR_AWS_SECRET_KEY'
    }

    catalog_client = CatalogItems(credentials=credentials, marketplace=Marketplaces.DE)
    for asin in asin_list:
        # 修正includedData参数,明确请求需要的字段
        response = catalog_client.get_catalog_item(asin, includedData=["summaries", "salesRanks"], marketplaceId="A1PA6795UKMFR9")
        payload = response.payload
        
        # 初始化默认值,避免字段缺失报错
        asin_data = {
            'asin': asin,
            'brand_name': '',
            'item_name': '',
            'manufacturer': '',
            'sales_rank_title_1': '',
            'sales_rank_value_1': '',
            'sales_rank_title_2': '',
            'sales_rank_value_2': '',
        }

        # 处理summaries字段,判断存在性再访问
        summaries = payload.get('summaries', [])
        if summaries:
            summary = summaries[0]
            asin_data['brand_name'] = summary.get('brandName', '')
            asin_data['item_name'] = summary.get('itemName', '')
            asin_data['manufacturer'] = summary.get('manufacturer', '')

        # 处理salesRanks字段,判断存在性再访问
        sales_ranks = payload.get('salesRanks', [])
        if sales_ranks:
            rank_group = sales_ranks[0]
            ranks = rank_group.get('ranks', [])
            # 处理第一个排名
            if len(ranks) >=1:
                asin_data['sales_rank_title_1'] = ranks[0].get('title', '')
                asin_data['sales_rank_value_1'] = ranks[0].get('value', '')
            # 处理第二个排名
            if len(ranks) >=2:
                asin_data['sales_rank_title_2'] = ranks[1].get('title', '')
                asin_data['sales_rank_value_2'] = ranks[1].get('value', '')
        
        print(asin_data)

# 测试用ASIN列表
asin_list = ["B01AT3OE7M", "B01LWWJP2M", "B07D5D6628"]
get_catalog_items(asin_list)

关键优化点

  • 字段请求匹配:确保includedData包含你后续要访问的salesRanks字段,且参数格式正确(每个字段为独立数组元素)。
  • 安全访问字段:使用dict.get()方法替代直接下标访问,同时判断数组是否为空,避免KeyError和IndexError。
  • 默认值初始化:提前给所有字段设置默认空值,保证即使某些ASIN无数据,也能返回完整的字典结构。

内容的提问来源于stack exchange,提问作者BenPepp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:32:17