在Jupyter Notebook解析世界银行互联网渗透率数据时遇KeyError求助
解决世界银行API数据解析的KeyError('date')问题
问题根源
- 错误使用BeautifulSoup解析JSON:世界银行API返回的是标准JSON格式,无需转成字符串再用BeautifulSoup(HTML/XML解析库)处理,用错工具导致解析结构完全不符合预期。
- 数据提取逻辑错误:原代码试图寻找
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
相关产品推荐
相关产品推荐

