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

Python爬取JSON数据遇JSONDecodeError,如何提取列表ID值?

问题分析与解决方案

咱们一步步来解决你的问题,先搞定JSON解码错误,再修正ID提取的逻辑:

1. 解决 JSONDecodeError 错误

这个错误说明你的请求返回的内容不是有效的JSON格式——可能是空内容、HTML错误页面(比如404/500页面),或者服务器没有返回JSON数据。你可以按以下步骤排查修复:

  • 先排查响应内容:在调用r.json()前,先打印状态码和原始响应内容,搞清楚实际拿到的是什么:

    import json
    url = 'link'
    r = session.get(url, headers=headers)
    
    # 先检查请求状态码
    print("响应状态码:", r.status_code)
    # 打印原始响应内容
    print("原始响应内容:", r.text)
    

    如果状态码是4xx/5xx,说明请求本身出错了;如果返回的是HTML代码,那说明你请求的链接不对,或者需要额外的验证(比如登录)。

  • 补充正确的请求头:很多API要求请求头里明确声明接受JSON格式,你可以给headers添加Accept字段:

    headers = {
        # 保留你原来的其他头信息(比如User-Agent等)
        'Accept': 'application/json'
    }
    
  • 检查session的有效性:如果目标接口需要登录才能访问,确认你的session是否已经保存了正确的登录Cookie,否则服务器会返回登录页面(HTML)而非JSON。

2. 正确提取ID为列表

假设请求已经拿到了你提供的有效JSON响应,你原来的代码js["lister"]['id']会报错——因为js["lister"]是一个列表,不是单个字典,你需要遍历列表来提取每个元素的id:

完整修正后的代码

import json

url = 'link'
headers = {
    # 补充你的请求头,比如User-Agent、Accept等
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
    'Accept': 'application/json'
}

r = session.get(url, headers=headers)

if r.status_code == 200:
    try:
        js = r.json()
        # 列表推导式遍历lister,提取所有id
        user_id_list = [item['id'] for item in js["lister"]]
        print("提取到的ID列表:", user_id_list)  # 输出: [12345, 67899]
    except json.decoder.JSONDecodeError as e:
        print(f"JSON解码失败: {str(e)}")
        print("请检查响应内容是否为有效JSON:", r.text)
else:
    print(f"请求失败,状态码: {r.status_code}")
    print("响应内容:", r.text)

另外注意:你提供的示例JSON里only字段的值fal和gal没有加引号,这是无效的JSON格式。如果实际服务器返回的是这样的内容,也会导致解码失败,不过这种情况一般是服务器的问题,先优先排查前面的请求问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:52:15