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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:47:54