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

Python解析API嵌套JSON:分页提取指定字段报错解决

问题解决:NFZ API数据提取报错修正

错误原因

你代码第18行的报错源于索引逻辑错误:all_data已经是response['data']['agreements']返回的列表对象,你却试图用字符串索引['data']['agreements']访问它——列表仅支持整数/切片索引,因此触发"list indices must be integers or slices, not str"错误。同时原代码中providerlist.append(providers)放在循环外,只会收集最后一条数据,无法实现批量提取。

修正后的代码

import requests
import math
import pandas as pd

# 移除baseurl中多余的page参数,避免动态拼接时重复
baseurl = 'https://api.nfz.gov.pl/app-umw-api/agreements?year=2022&branch=01&productCode=01.0010.094.01&limit=10&format=json&api-version=1.2'

def main_request(baseurl, x):
    r = requests.get(baseurl + f'&page={x}')
    return r.json()

def get_pages(response):
    return math.ceil(response['meta']['count'] / 10)

def get_names(response):
    providerlist = []
    # all_data已经是agreements列表,直接遍历每个条目
    all_data = response['data']['agreements']
    for agreement in all_data:
        # 提取目标字段
        provider_name = agreement['attributes']['provider-name']
        # 将每个字段存入字典并添加到列表
        providerlist.append({'provider-name': provider_name})
    return providerlist

mainlist = []
data = main_request(baseurl, 1)
total_pages = get_pages(data)
# 遍历所有分页
for x in range(1, total_pages + 1):
    mainlist.extend(get_names(main_request(baseurl, x)))

# 生成DataFrame
mydataframe = pd.DataFrame(mainlist)
print(mydataframe)

关键修改说明

  1. 修正索引逻辑:直接遍历all_data列表(已对应response['data']['agreements']),无需重复索引
  2. 调整收集位置:将providerlist.append()移入循环内,确保每个provider-name都被收集
  3. 优化参数结构:移除baseurl中固定的page=1,避免动态拼接时参数冲突
  4. 符合需求要求:使用requests内置的r.json()解析数据,无需额外导入json包,也未生成JSON文件

内容的提问来源于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.05 02:50:35