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

在Jupyter Notebook解析世界银行互联网渗透率数据时遇KeyError求助

解决世界银行API数据解析的KeyError('date')问题

问题根源

  1. 错误使用BeautifulSoup解析JSON:世界银行API返回的是标准JSON格式,无需转成字符串再用BeautifulSoup(HTML/XML解析库)处理,用错工具导致解析结构完全不符合预期。
  2. 数据提取逻辑错误:原代码试图寻找data标签,但JSON转字符串后被解析的结构里根本不存在该标签,内层循环从未执行,最终parsed_data为空,DataFrame自然没有date列,触发KeyError。

修复后的代码

直接处理API返回的JSON数据,跳过无用的BeautifulSoup步骤,正确提取字段:

import pandas as pd
import requests

url = 'https://api.worldbank.org/v2/country/all/indicator/IT.NET.USER.ZS'
params = {
    'format': 'json',
    'date': '1990:2022',
    'per_page': '10000'  # 单次请求最大结果数
}

r = requests.get(url, params=params)
data = r.json()[1]  # 索引1对应实际数据列表

# 直接从JSON数据中提取所需字段
parsed_data = []
for entry in data:
    # 安全处理可能的空值(比如部分年份无数据时value为None)
    parsed_data.append({
        'countryiso3code': entry.get('countryiso3code'),
        'country': entry.get('country', {}).get('value'),
        'date': entry.get('date'),
        'value': entry.get('value')
    })

# 创建DataFrame
df = pd.DataFrame(parsed_data)

# 转换日期格式并过滤
df['date'] = pd.to_datetime(df['date'], errors='coerce')
# 用dt.year提取年份过滤,比强制转int更可靠
df = df[df['date'].dt.year >= 1990]

# 可选:查看处理后的数据
print(df.head())

关键修复点说明

  • 移除BeautifulSoup依赖:直接操作API返回的JSON列表和字典,这是处理JSON API的标准方式。
  • 正确提取嵌套字段:country在原JSON中是嵌套字典,用entry.get('country', {}).get('value')避免空值触发KeyError。
  • 空值安全处理:用get()方法提取字段,兼容部分国家/年份无数据的情况。
  • 日期过滤优化:使用dt.year提取年份进行过滤,逻辑更清晰且不易出错。

内容的提问来源于stack exchange,提问作者Satyam Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:30