使用eBay API时遭遇ItemSpecifics相关错误的排查求助
eBay Trading API批量上架商品的ItemSpecifics问题解决
问题背景
使用Python调用eBay Trading API批量上架商品时,ItemSpecifics字段始终无法正确处理,出现两种错误:直接赋值时触发KeyError,注释后API返回必填项缺失错误。
代码实现
import ebaysdk import csv from ebaysdk.trading import Connection as Trading from ebaysdk.exception import ConnectionError from item_description import code_block from item_definition import myitem def addItem(): try: api = Trading(config_file='ebay.yaml') # Open our CSV file that has individual auction item details. with open("auction_data.csv") as auction_data_file: auction_item = csv.reader(auction_data_file) # Skip headers. next(auction_item, None) for row in auction_item: myitem["Item"]["Title"] = row[0] # HTML item description template is stored in separate file. Only the item Title will be populated dynamically. myitem["Item"]["Description"] = code_block.format(row[0]) myitem["Item"]["PrimaryCategory"]["CategoryID"] = row[1] myitem["Item"]["StartPrice"] = row[2] myitem["Item"]["ShippingPackageDetails"]["WeightMajor"] = row[3] myitem["Item"]["ShippingPackageDetails"]["WeightMinor"] = row[4] myitem["Item"]["ShippingPackageDetails"]["PackageDepth"] = row[5] myitem["Item"]["ShippingPackageDetails"]["PackageWidth"] = row[6] myitem["Item"]["ShippingPackageDetails"]["PackageLength"] = row[7] myitem["Item"]["ScheduleTime"] = row[8] # Delete all values from our PictureURL list from previous iterations. myitem["Item"]["PictureDetails"]["PictureURL"] = [] myitem["Item"]["ItemSpecifics"]["NameValueList"].append({'Name': 'Sport', 'Value': row[9]}) myitem["Item"]["ItemSpecifics"]["NameValueList"].append({'Name': 'Graded', 'Value': row[10]}) # Last column in CSV file contains list of images delimited by pipe. item_images = row[11].split('|') # Upload each image to eBay and retrieve the site hosted URL, then append that to PictureURL list. for image in item_images: files = { 'file': ('EbayImage', open(image, 'rb')) } api.execute('UploadSiteHostedPictures', files=files) myitem["Item"]["PictureDetails"]["PictureURL"].append(api.response.dict()["SiteHostedPictureDetails"]["FullURL"]) # After adding auction item, print out Title and Item # for tracking. api.execute('AddItem', myitem) print (row[0] + ' - ' + api.response.dict()["ItemID"]) except ConnectionError as e: print(e) addItem()
第一次错误信息
Traceback (most recent call last): File "/Users/jay/Desktop/Random Docs/eBay Selling/eBay - Baseball Cards/list_item.py", line 59, in <module> addItem() File "/Users/jay/Desktop/Random Docs/eBay Selling/eBay - Baseball Cards/list_item.py", line 36, in addItem myitem["Item"]["ItemSpecifics"]["NameValueList"].append({'Name': 'Sport', 'Value': row[9]}) KeyError: 'ItemSpecifics'
已确认的CSV数据
Card Name, Category, Price, Pounds, Ounces, Depth, Width, Length, Start Time, Sport, Graded, Images Joe Jurevicius Auto,261328,.99,0,2,1,6,9,2023-04-11 00:00:00,Baseball,No, 1.jpg
注释ItemSpecifics后的错误信息
'AddItem: Class: RequestError, Severity: Error, Code: 21919303, The item specific Sport\xa0is missing. The item specific Sport\xa0is missing.\xa0Add Sport to this listing, enter a valid value, and then try again., Class: RequestError, Severity: Error, Code: 21919303, The item specific Graded\xa0is missing. The item specific Graded\xa0is missing.\xa0Add Graded to this listing, enter a valid value, and then try again.'
问题原因及解决方案
原因1:myitem字典未初始化ItemSpecifics字段
第一次报错的KeyError是因为myitem["Item"]中不存在ItemSpecifics这个键,直接访问其下的NameValueList会触发错误。同时,myitem是全局复用的对象,若循环中仅用append添加属性,会导致上一次循环的NameValueList数据残留,引发其他问题。
原因2:CSV数据存在非标准空格
错误信息中的Sport\xa0是非标准空格,说明CSV中对应字段可能带有多余空格,导致API识别失败。
修复代码
将循环中处理ItemSpecifics的代码替换为以下内容:
# 初始化ItemSpecifics结构,清空上一次循环的残留数据,同时避免KeyError myitem["Item"]["ItemSpecifics"] = { "NameValueList": [ {'Name': 'Sport', 'Value': row[9].strip()}, # strip()去除首尾空格(包括非标准空格) {'Name': 'Graded', 'Value': row[10].strip()} ] }
额外注意事项
- 若该分类下有更多必填的Item Specifics,需一并添加到
NameValueList中; - 确保
myitem中的其他字段(如PictureDetails)也在每次循环中正确重置,避免数据污染; - 可在调试时打印
myitem["Item"]["ItemSpecifics"],确认结构和值是否符合eBay API要求。
内容的提问来源于stack exchange,提问作者user3299633
相关产品推荐
相关产品推荐

