调用API获取JSON数据后循环遍历存入pandas DataFrame报错问询
错误原因&修正方案
核心错误点
- 内层循环逻辑错误:
for i in parse_json遍历的是JSON返回体顶层字典的键(均为字符串类型,比如results、total_pages等),并非你需要的results数组的下标,将字符串作为列表索引直接触发类型错误。 - 页码起始值错误:目标API的页码从1开始计数,原代码使用
np.arange(0,7)生成0-6的页码,会导致第一页请求返回无效结果。
修正后可运行代码
import requests import json import pandas as pd # 存储结果的列表 result_list = [] # 页码从1到7,无需引入numpy for page in range(1, 8): url = f'https://www.federalregister.gov/api/v1/documents.json?conditions%5Bpublication_date%5D%5Bgte%5D=09%2F01%2F2021&conditions%5Bterm%5D=economy&order=relevant&page={page}' response_API = requests.get(url) # 仅处理请求成功的响应 if response_API.status_code != 200: print(f"第{page}页请求失败,状态码:{response_API.status_code}") continue parse_json = json.loads(response_API.text) # 直接遍历results数组,无需手动处理索引 for item in parse_json['results']: title = item['title'] pub_date = item['publication_date'] # 兼容agencies为空的情况,避免索引报错 agency = item['agencies'][0]['name'] if item.get('agencies') else '无对应机构' result_list.append([title, pub_date, agency]) # 转DataFrame cols = ["Title", "Date","Agency"] df = pd.DataFrame(result_list, columns=cols)
额外优化建议
- 可以加请求延迟,避免触发API频率限制,比如在循环末尾加
time.sleep(1),需要提前导入time模块 - 可以先取总页数动态生成循环范围,不用硬编码7页,从
parse_json['total_pages']就能拿到总页数
内容的提问来源于stack exchange,提问作者user2813606
相关产品推荐
相关产品推荐

