You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动