多邮政编码调用API存储JSON数据至DataFrame时遭遇JSONDecodeError错误求助
解决多个邮政编码API请求的JSONDecodeError问题
我一眼就看到了你代码里的问题所在——循环里的URL请求逻辑写错了,这才导致返回的内容不是合法的单个JSON对象,进而触发了解析错误。咱们一步步来修复:
问题根源
你在循环里已经通过字符串拼接生成了单个cep的URL:
url = "https://www.cepaberto.com/api/v3/cep?cep="+str(cep)
但紧接着又错误地用url.format(cep=ceps)去格式化这个URL——这里的ceps是整个邮政编码列表,不是当前循环的单个cep!这会让请求的URL变成类似https://www.cepaberto.com/api/v3/cep?cep=69027320['69027320', '38411206', ...],服务器返回的内容肯定不是合法的单个JSON,自然解析失败。
修正后的代码
我帮你把代码改对,还加了异常处理防止单个请求失败影响整个流程:
import requests import pandas as pd ceps = ['69027320', '38411206', '78118187', '12245481'] jsonfile = [] headers = {'Authorization': 'Token token=111111111111111111111111111111'} for cep in ceps: # 用params传参更规范,避免字符串拼接出错 url = "https://www.cepaberto.com/api/v3/cep" params = {'cep': cep} try: response = requests.get(url, params=params, headers=headers) # 先检查响应状态码,确保请求成功 response.raise_for_status() json_data = response.json() jsonfile.append(json_data) except requests.exceptions.RequestException as e: print(f"请求CEP {cep} 失败: {e}") # 可选:添加错误标记或跳过该条目 jsonfile.append({'cep': cep, 'error': '请求失败'}) # 生成结构化DataFrame df = pd.json_normalize(jsonfile) print(df)
关键改进点
- 改用
requests.get()的params参数传递邮政编码,比字符串拼接更安全,能自动处理特殊字符 - 添加
response.raise_for_status(),如果请求返回4xx/5xx错误会直接抛出异常,方便排查问题 - 增加异常捕获逻辑,单个CEP请求失败不会导致整个程序终止
- 移除了错误的
url.format(cep=ceps)调用,确保每个请求都是针对单个CEP的
这样修改后,每个请求都会返回单个合法的JSON对象,response.json()就能正确解析,最终也能顺利生成Pandas DataFrame了。
内容的提问来源于stack exchange,提问作者Mariana
相关产品推荐
相关产品推荐

