Python解析requests返回的嵌套JSON列表访问key报KeyError问题咨询
问题原因与解决方法
1. KeyError 报错原因
你遇到的KeyError核心原因是要访问的key不在当前层级的字典中,需要严格按照JSON的嵌套结构逐层访问:
- 最外层
result是列表,每个元素result[i]是一级字典,仅包含created_at、id、entities等一级键 n_name、hashtag对应的text等键属于嵌套结构:result[i]→ 一级键entities(值为二级字典) → 二级键user_ment/hashtags(值为列表) → 列表中每个元素是存储n_name/text的字典
你直接写result[3]['n_name'][0]跳过了entities和user_ment两层结构,自然会找不到key抛出异常。
2. 全量数据提取方法
步骤1:先确认完整结构
先打印完整的嵌套结构,明确所有key的层级:
import json # 格式化打印第3条数据的完整结构 print(json.dumps(result[3], indent=2, ensure_ascii=False))
步骤2:逐层访问+容错处理
访问时严格按照层级书写,同时用dict.get()方法、列表长度判断做容错,避免不存在的key/索引导致程序崩溃:
import requests url = 'https://api.example.com/' bearer_token = 'my_token' result = requests.get( url, headers={'Content-Type':'application/json','Authorization': f'Bearer {bearer_token}'} ).json() # 遍历所有数据 for index, item in enumerate(result): # 提取一级字段 created_at = item.get('created_at', '无创建时间') text = item.get('text', '无内容') print(f"第{index}条数据 创建时间:{created_at} 内容:{text}") # 提取嵌套的用户提及信息 entities = item.get('entities', {}) user_ment_list = entities.get('user_ment', []) for ment in user_ment_list: n_name = ment.get('n_name', '无用户名') print(f"提及用户:{n_name}") # 提取嵌套的标签信息 hashtag_list = entities.get('hashtags', []) for tag in hashtag_list: tag_text = tag.get('text', '无标签内容') print(f"关联标签:{tag_text}")
3. 同名key提取方法
不同层级的同名key相互独立,只要按照目标key所在的层级访问即可。如果需要全局提取所有层级下同名key的所有值,可以用递归遍历实现:
def fetch_all_values_by_key(data, target_key): res = [] if isinstance(data, dict): for k, v in data.items(): if k == target_key: res.append(v) res.extend(fetch_all_values_by_key(v, target_key)) elif isinstance(data, list): for item in data: res.extend(fetch_all_values_by_key(item, target_key)) return res # 示例:提取所有层级下所有n_name的值 all_n_names = fetch_all_values_by_key(result, 'n_name') print(all_n_names)
4. 索引追加方式说明
你写的print(result[3]['n_name'][0])不可行,缺少中间层级。正确的访问写法如下,增加容错处理后不会报错:
# 基础写法(结构完全确定时使用) print(result[3]['entities']['user_ment'][0]['n_name']) # 带容错的写法(结构不确定时避免崩溃) user_ment = result[3].get('entities', {}).get('user_ment', []) if len(user_ment) > 0: print(user_ment[0].get('n_name', '无用户名')) else: print('无提及用户')
内容的提问来源于stack exchange,提问作者VRapport
相关产品推荐
相关产品推荐

