如何在Python中检查URL返回内容是否为JSON并避免脚本崩溃?
判断URL是否返回有效JSON的Python解决方案
你的问题很典型——直接调用result.json()确实会在非JSON响应时崩溃,因为requests库会尝试强制解析内容,失败就抛出异常。这里有两种实用的方法,结合起来使用效果最好:
1. 捕获JSONDecodeError异常(最可靠)
当响应内容无法解析为JSON时,requests会抛出JSONDecodeError异常。我们可以用try-except块捕获这个异常,以此精准判断是否为有效JSON:
import pandas as pd from requests import get from requests.exceptions import JSONDecodeError # 导入对应的异常类 lista = pd.read_csv('sites.csv', sep=',') df = pd.DataFrame(lista, columns=['Site', 'Json']) newdf = df.assign(Site=df['Site'].map(str) + 'Json') for site_url in newdf['Site']: result = get(site_url) # 先确认请求成功(状态码200) if result.status_code == 200: is_valid_json = False try: # 尝试解析JSON,成功则标记为有效 result.json() is_valid_json = True except JSONDecodeError: # 解析失败,说明不是JSON格式 pass print(f"站点 {site_url}: {'返回有效JSON' if is_valid_json else '未返回有效JSON'}") else: print(f"站点 {site_url}: 请求失败,状态码 {result.status_code}")
这个方法的核心优势是完全基于内容本身判断,不受服务器响应头的影响——不管服务器有没有正确设置类型标识,只要内容能被解析成JSON,就会被判定为有效。
2. 辅助检查Content-Type响应头(可选)
有些规范的服务器会在响应头的Content-Type字段里标注返回内容类型,JSON响应通常会包含application/json。你可以把这个作为前置过滤,减少异常捕获的次数:
# 在try-except之前添加这行判断(可选) if 'application/json' in result.headers.get('Content-Type', ''): # 再尝试解析JSON ...
不过要注意:这个方法不能单独使用,因为有些服务器可能返回JSON但没设置正确的Content-Type,或者设置了标识但内容不是JSON。所以它更适合作为初步筛选,最终还是要靠异常捕获来确认有效性。
为什么你的原脚本会崩溃?
当响应内容不是JSON时,result.json()会直接抛出JSONDecodeError,而你的代码没有任何异常处理逻辑,导致脚本直接终止。通过添加try-except块,我们可以优雅地处理这种情况,让脚本继续运行。
内容的提问来源于stack exchange,提问作者Douglas Soares




