Python访问SP-API返回JSON的salesRanks/ranks字段报KeyError求助
问题分析与解决方案
错误原因
请求字段与访问字段不匹配
报错代码中,请求API时指定的includedData=["summaries", "ranks"],但后续代码尝试访问payload['salesRanks']字段。如果API仅返回你请求的ranks字段,自然找不到salesRanks,触发KeyError。另外你第一次测试代码里的["summaries, salesRanks"]写法也有问题——这是一个包含单个字符串的数组,正确写法应该是把每个字段作为独立数组元素:["summaries", "salesRanks"]。未处理字段缺失的情况
部分ASIN可能没有销售排名数据,返回的payload中可能不存在salesRanks或ranks,或者对应的数组为空。直接通过下标(比如[0])访问会触发KeyError或IndexError。冗余的重复赋值
代码中'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
相关产品推荐
相关产品推荐

