Python调用API后如何从JSON响应提取F1赛事特定字段?遇KeyError: 'time'
报错原因
KeyError: 'time'的核心问题是,你要找的*time字段*根本不在你当前访问的字典层级上。
你调用response.json()拿到的data是整个JSON响应的最外层根字典,对照你贴的响应结构看,这个根字典下只有MRData一个一级键,根本不存在直接叫time的顶层键,所以直接写data["time"]必然触发键不存在的报错。
正确的取数路径
你拿到的是典型的多层嵌套JSON结构,从根节点到你要的time字段需要逐层向下访问,完整路径为:
- 第一步:从根字典进入API返回的核心数据层,取
data["MRData"] - 第二步:从核心数据层进入赛事表格容器,取
data["MRData"]["RaceTable"] - 第三步:从容器的赛事列表里取出单场赛事对象,取
data["MRData"]["RaceTable"]["Races"][0]- 这里要注意,
Races是列表类型,你当前请求只返回了1场赛事,所以取列表索引为0的元素就行;如果后续查询返回多场赛事,直接遍历这个列表就能拿到所有场次的数据
- 这里要注意,
- 第四步:在单场赛事的字典对象中,才存在
time这个键,直接访问就能拿到赛事开始时间
修正后的可运行代码
import requests response = requests.get("http://ergast.com/api/f1/2020/6.json") data = response.json() # 逐层访问获取目标的赛事时间字段 race_start_time = data["MRData"]["RaceTable"]["Races"][0]["time"] print(race_start_time)
运行这段代码会正常输出13:10:00Z,不会再抛出KeyError。
常用拓展字段取法参考
后续你要提取其他赛事信息时,直接对照嵌套层级访问即可,几个常用字段的路径如下:
- 赛事正式名称:
data["MRData"]["RaceTable"]["Races"][0]["raceName"] - 赛事举办自然日期:
data["MRData"]["RaceTable"]["Races"][0]["date"] - 赛道正式名称:
data["MRData"]["RaceTable"]["Races"][0]["Circuit"]["circuitName"] - 赛道所在国家:
data["MRData"]["RaceTable"]["Races"][0]["Circuit"]["Location"]["country"] - 赛道所在具体属地:
data["MRData"]["RaceTable"]["Races"][0]["Circuit"]["Location"]["locality"]
内容的提问来源于stack exchange,提问作者Shephard_
相关产品推荐
相关产品推荐

