You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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文件")

关键修正与说明

  1. 异常安全处理:使用get()方法访问字典键,避免因字段缺失抛出异常;添加try-except块确保单个请求失败不终止整个脚本
  2. 完整需求覆盖:
    • 单独收集每个请求的meta.count值并保存到独立CSV文件
    • 合并header全部字段、agreement-plan.id和agreement-plan.attributes所有字段
  3. 移除冗余代码:删除未使用的函数和无效调用,简化请求逻辑

特殊情况兼容

如果实际返回的agreement-plan确实是纯字符串(仅为ID值),可修改对应提取逻辑为:

plan_id = item.get('agreement-plan')
plan_attrs = {}

内容的提问来源于stack exchange,提问作者Michael Wiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:50:22