你想知道如何用 Python 解析京东商品详情 API 返回的 JSON 数据,我会从「数据结构分析→基础解析→复杂字段解析→异常处理」全流程拆解,结合真实的 JSON 示例给出可直接运行的代码,确保你能精准提取价格、销量、规格等核心字段,同时规避解析过程中的常见坑。

一、核心前提

  1. 数据准备:先通过京东 API(开放平台 / 第三方 / 抓包)获取 JSON 格式的商品详情数据(下文附真实示例);
  2. 依赖说明:仅需 Python 内置的json模块(无需额外安装),如需批量处理可搭配pandas

二、京东商品详情 API JSON 数据示例(真实结构)

先看一份典型的京东商品详情 JSON 返回(第三方 API / 开放平台通用结构),后续解析均基于此:

json

{
  "error_code": 0,
  "reason": "success",
  "result": {
    "sku_id": "100060195820",
    "title": "京东京造 轻量便携保温杯 350ml 白色 316不锈钢水杯",
    "price": "99.9",
    "original_price": "129.9",
    "sales": "10万+",
    "stock_state": "有货",
    "stock_num": "10000+",
    "shop_name": "京东京造官方旗舰店",
    "brand": "京东京造",
    "pic_url": "https://img10.360buyimg.com/n1/jfs/t1/24350/10/5360/133513/66f19952F80d97870/xxx.jpg",
    "spec_info": "颜色:白色|容量:350ml",
    "spec_list": [
      {"name": "颜色", "value": "白色"},
      {"name": "容量", "value": "350ml"}
    ],
    "delivery_place": "北京",
    "good_rate": "98%",
    "category": "家居>厨具>水杯>保温杯"
  }
}

三、Python 解析 JSON 数据全流程(分步实现)

步骤 1:基础解析(提取核心简单字段)

先将 JSON 字符串转为 Python 字典,再提取标题、价格、店铺名称等基础字段,这是最常用的解析场景。

python

运行

import json

# 1. 模拟API返回的JSON字符串(实际开发中替换为API请求的response.text)
json_str = '''
{
  "error_code": 0,
  "reason": "success",
  "result": {
    "sku_id": "100060195820",
    "title": "京东京造 轻量便携保温杯 350ml 白色 316不锈钢水杯",
    "price": "99.9",
    "original_price": "129.9",
    "sales": "10万+",
    "stock_state": "有货",
    "shop_name": "京东京造官方旗舰店"
  }
}
'''

# 2. 将JSON字符串解析为Python字典(核心步骤)
try:
    # 解析JSON,ensure_ascii=False保留中文
    data = json.loads(json_str)
except json.JSONDecodeError as e:
    print(f"JSON解析失败:{e}")
    exit()

# 3. 提取核心字段(用dict.get()避免字段缺失报错,新手必学)
if data.get("error_code") == 0:  # 先判断API调用是否成功
    item = data.get("result", {})  # 商品数据主体
    
    # 提取简单字段(基础信息)
    sku_id = item.get("sku_id", "未知")  # 字段缺失时返回"未知"
    title = item.get("title", "未知")
    price = float(item.get("price", 0.0))  # 价格转为浮点数(便于计算)
    original_price = float(item.get("original_price", 0.0))
    sales = item.get("sales", "0")
    stock_state = item.get("stock_state", "未知")
    shop_name = item.get("shop_name", "未知")
    
    # 打印解析结果
    print("=== 基础字段解析结果 ===")
    print(f"商品ID:{sku_id}")
    print(f"商品标题:{title}")
    print(f"当前价格:{price}元(原价:{original_price}元)")
    print(f"销量:{sales}")
    print(f"库存状态:{stock_state}")
    print(f"店铺名称:{shop_name}")
else:
    print(f"API调用失败:{data.get('reason', '未知原因')}")
步骤 2:复杂字段解析(规格、分类等)

针对 JSON 中的数组、字符串拼接的复杂字段(如规格列表、分类路径),需做针对性解析:

python

运行

# 接上文的data变量,继续解析复杂字段
item = data.get("result", {})

# 1. 解析规格列表(数组类型)
spec_list = item.get("spec_list", [])
print("\n=== 规格列表解析结果 ===")
for spec in spec_list:
    spec_name = spec.get("name", "未知")
    spec_value = spec.get("value", "未知")
    print(f"{spec_name}:{spec_value}")

# 2. 解析拼接的规格字符串(如"颜色:白色|容量:350ml")
spec_info = item.get("spec_info", "")
if spec_info:
    spec_dict = {}
    # 按|分割,再按:分割键值
    for s in spec_info.split("|"):
        if ":" in s:
            k, v = s.split(":", 1)  # 1表示只分割一次,避免值含:
            spec_dict[k.strip()] = v.strip()
    print("\n=== 拼接规格字符串解析结果 ===")
    print(spec_dict)

# 3. 解析分类路径(如"家居>厨具>水杯>保温杯")
category = item.get("category", "")
if category:
    category_list = category.split(">")
    print("\n=== 分类路径解析结果 ===")
    print(f"一级分类:{category_list[0] if category_list else '未知'}")
    print(f"二级分类:{category_list[1] if len(category_list)>=2 else '未知'}")
    print(f"末级分类:{category_list[-1] if category_list else '未知'}")

# 4. 销量字段标准化(将"10万+"转为数值100000)
sales = item.get("sales", "0")
def parse_sales(sales_str):
    if "万+" in sales_str:
        return int(float(sales_str.replace("万+", "")) * 10000)
    elif "万" in sales_str:
        return int(float(sales_str.replace("万", "")) * 10000)
    else:
        return int(float(sales_str.replace("+", ""))) if sales_str.replace("+", "").isdigit() else 0

sales_num = parse_sales(sales)
print("\n=== 销量标准化结果 ===")
print(f"原始销量:{sales} → 数值销量:{sales_num}")
步骤 3:批量解析(多商品 JSON 数据)

如果返回的是多商品 JSON 数组,或批量采集了多个商品的 JSON 数据,可循环解析:

python

运行

# 模拟多商品JSON数组
multi_json_str = '''
[
  {
    "error_code": 0,
    "reason": "success",
    "result": {"sku_id": "100060195820", "title": "保温杯", "price": "99.9"}
  },
  {
    "error_code": 0,
    "reason": "success",
    "result": {"sku_id": "100080907904", "title": "充电宝", "price": "89.9"}
  }
]
'''

# 批量解析
try:
    multi_data = json.loads(multi_json_str)
    print("\n=== 批量解析结果 ===")
    for idx, item_data in enumerate(multi_data):
        if item_data.get("error_code") == 0:
            item = item_data.get("result", {})
            print(f"商品{idx+1}:ID={item.get('sku_id')},标题={item.get('title')},价格={item.get('price')}元")
except Exception as e:
    print(f"批量解析失败:{e}")
步骤 4:结合 Pandas 解析(便于数据分析)

如需将解析后的数据存入表格 / 做分析,可搭配pandas

python

运行

import pandas as pd

# 解析后的数据存入列表
parsed_data = []
item = data.get("result", {})
parsed_data.append({
    "sku_id": item.get("sku_id"),
    "title": item.get("title"),
    "price": float(item.get("price", 0.0)),
    "sales": parse_sales(item.get("sales", "0")),
    "stock_state": item.get("stock_state")
})

# 转为DataFrame
df = pd.DataFrame(parsed_data)
print("\n=== Pandas解析结果(表格) ===")
print(df)

# 保存为CSV
df.to_csv("jd_item_parsed.csv", index=False, encoding="utf-8-sig")
print("解析后的数据已保存为jd_item_parsed.csv")

四、解析过程中的核心避坑点

  1. 避免 KeyError
    • 不要直接用data["result"]["price"],而是用data.get("result", {}).get("price", "未知"),字段缺失时返回默认值;
  2. 数据类型转换
    • 价格、销量等字段返回的是字符串,需转为float/int才能做计算(如价格对比、销量排序);
  3. JSON 格式错误
    • 解析前用try-except捕获JSONDecodeError,避免因 API 返回非标准 JSON 导致程序崩溃;
  4. 特殊字符处理
    • 解析规格、标题等含特殊字符的字段时,用strip()去除首尾空格,避免数据脏污;
  5. 多层级嵌套
    • 开放平台 API 的 JSON 可能有多层嵌套(如response["data"]["item"]["price"]),需逐层用get()解析。

总结

  1. 核心步骤json.loads()将 JSON 字符串转字典 → 用dict.get()安全提取字段 → 针对复杂字段(规格、销量)做格式化处理;
  2. 关键技巧:所有字段提取均用get()+ 默认值,避免 KeyError;数值型字段(价格、销量)务必做类型转换;
  3. 扩展场景:批量解析用循环,数据分析用 Pandas,核心逻辑不变。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐