Python请求获取JSON数据时JSONDecodeError问题排查
问题分析与解决方案
先帮你拆解下遇到的核心问题:浏览器能正常显示JSON内容,但requests返回的响应头标注为text/html,调用req_obj.json()还抛出JSONDecodeError,主要原因通常有这几个:
1. 响应内容夹杂非JSON冗余字符
服务器返回的内容虽然看起来是JSON,但实际可能隐藏了HTML注释、多余换行、空白前缀/后缀,甚至是不起眼的HTML标签。浏览器的JSON渲染器会自动过滤这些无效内容,只提取合法的JSON部分展示;但requests的json()方法严格遵循JSON规范解析,只要文本开头不是{或[这类合法JSON起始符,就会直接报错。
你可以先打印响应文本的前后片段验证这个猜测:
print("开头100字符:", req_obj.text[:100]) print("结尾100字符:", req_obj.text[-100:])
如果确实发现冗余内容,用正则提取完整的JSON块是个靠谱的办法:
import re import json # 匹配从{开始到}结束的所有内容(支持多行结构) json_pattern = re.compile(r'\{.*\}', re.DOTALL) match_result = json_pattern.search(req_obj.text) if match_result: clean_json_str = match_result.group() try: data = json.loads(clean_json_str) print("解析成功:", data) except json.JSONDecodeError as e: print("清理后仍解析失败:", e) else: print("未找到有效的JSON结构")
2. 服务器做了User-Agent校验
浏览器访问时会携带特定的User-Agent标识,而requests默认的UA是python-requests/x.x.x,有些服务器会根据UA返回不同格式的内容——给浏览器返回JSON(虽然标错了content-type),给爬虫类UA返回HTML或其他格式。
你可以模拟浏览器的UA重新请求试试:
headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36' } req_obj = requests.get(link, params=params, headers=headers) # 再次尝试解析 try: data = req_obj.json() print("解析成功:", data) except json.JSONDecodeError as e: print("仍解析失败:", e)
3. 额外排查:gzip解码异常?
虽然响应头有content-encoding: gzip,但requests默认会自动解码gzip内容,这个大概率不是问题。不过如果解码异常,也可以手动解码试试:
import gzip from io import BytesIO if req_obj.headers.get('content-encoding') == 'gzip': content = gzip.decompress(req_obj.content) json_str = content.decode('utf-8') data = json.loads(json_str) else: data = req_obj.json()
总结下,优先检查UA是否被服务器限制,再看响应内容是否有冗余字符,这两个是最常见的触发原因。
内容的提问来源于stack exchange,提问作者Baktaawar
相关产品推荐
相关产品推荐

