使用Python Requests解析NFZ API JSON时遇类型错误
问题排查与解决方案
错误原因分析
TypeError: string indices must be integers 报错的核心原因是:你代码中访问的a["agreement-plan"]是字符串类型(而非预期的字典结构),因此无法用['id']进行索引。此外你的代码还存在多处逻辑问题:
- 循环内定义的
main_request函数未被使用,属于冗余代码 - 错误使用
api_url.format(page):拼接后的api_url已包含完整请求参数(如page=1),无需再格式化替换 - 调用了未定义的
get_pages(p_number)函数
修正后的代码实现
以下代码完整实现你需要的三个数据提取需求,同时修复所有逻辑错误:
import requests import pandas as pd from plans_list1 import plans baseurl = 'https://api.nfz.gov.pl/app-umw-api/plans/' all_details = [] all_meta_counts = [] for plan in plans: api_url = baseurl + plan try: # 发送请求并处理HTTP错误 resp = requests.get(api_url) resp.raise_for_status() json_data = resp.json() # 提取meta中的count值 count_val = json_data.get('meta', {}).get('count', 'N/A') all_meta_counts.append({ 'request_url': api_url, 'total_count': count_val }) # 遍历data数组,提取核心数据 for item in json_data.get('data', []): # 提取header全部内容 header_info = item.get('header', {}) # 提取agreement-plan的id和attributes agreement_plan = item.get('agreement-plan', {}) plan_id = agreement_plan.get('id') plan_attrs = agreement_plan.get('attributes', {}) # 合并所有字段 combined_item = {**header_info, 'plan_id': plan_id, **plan_attrs} all_details.append(combined_item) except Exception as e: print(f"请求 {api_url} 失败: {str(e)}") continue # 保存详情数据到CSV df_details = pd.DataFrame(all_details) df_details.to_csv('2018-plans-detail.csv', encoding='utf-8-sig', index=False) # 保存meta中的count统计数据 df_counts = pd.DataFrame(all_meta_counts) df_counts.to_csv('2018-plans-meta-counts.csv', encoding='utf-8-sig', index=False) print("数据提取完成,结果已保存到CSV文件")
关键修正与说明
- 异常安全处理:使用
get()方法访问字典键,避免因字段缺失抛出异常;添加try-except块确保单个请求失败不终止整个脚本 - 完整需求覆盖:
- 单独收集每个请求的
meta.count值并保存到独立CSV文件 - 合并
header全部字段、agreement-plan.id和agreement-plan.attributes所有字段
- 单独收集每个请求的
- 移除冗余代码:删除未使用的函数和无效调用,简化请求逻辑
特殊情况兼容
如果实际返回的agreement-plan确实是纯字符串(仅为ID值),可修改对应提取逻辑为:
plan_id = item.get('agreement-plan') plan_attrs = {}
内容的提问来源于stack exchange,提问作者Michael Wiz
相关产品推荐
相关产品推荐

