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
相关产品推荐
相关产品推荐

