Python从API返回JSON取值遇KeyError,如何提取悉尼交易所对应标的URL
问题根因
你触发KeyError: 'exchange'的核心原因是接口返回的JSON层级和你预设的访问路径完全不匹配:
- 该搜索接口返回的
articles数组存储的是和搜索词匹配的新闻内容,这类元素本身就不会携带exchange、symbol这类证券基础属性字段,自然找不到对应的键 - 你要找的带
exchange字段的证券条目,实际归类在返回结构的quotes数组下,而非articles数组 - 就算路径匹配正确,搜索结果是按相关性排序的,数组首元素一般是市场关注度最高的标的(比如AMD的美股上市主体),你要找的Sydney交易所的Segue Resources只是结果列表里的靠后条目,固定取
[0]索引也根本碰不到目标值
可落地的修正方案
- 请求时补充基础请求头,避免接口因为缺失通用校验信息拦截请求,返回非预期的错误结构
- 优先遍历存储证券条目的
quotes数组,而非存新闻的articles数组 - 字典取值时用
.get()方法做容错,不要硬取不存在的键,从根源上避免KeyError - 全量遍历结果匹配
exchange值为Sydney的条目,匹配成功后提取对应的url字段
修正后的示例代码:
import requests # 补充请求头避免被接口拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } r = requests.get("https://api.investing.com/api/search/?t=Equities&q=amd", headers=headers) data = r.json() # 直接用requests内置的json解析方法,比手动loads(r.text)更可靠,能自动处理编码问题 # 遍历存证券条目的quotes数组,而非articles数组 for item in data.get("quotes", []): # 用get方法容错取值,避免KeyError exchange_val = item.get("exchange", "") if exchange_val == "Sydney": target_url = item.get("url") print(f"匹配到目标条目,对应url为:{target_url}") break else: print("未找到对应Sydney交易所的条目")
常见避坑提示
- 调试阶段不要凭主观猜测JSON结构,先打印
data.keys()、单个数组元素的所有键名,确认字段实际存储位置后再写取值逻辑 - 不要默认固定数组首元素就是目标对象,搜索结果的排序规则会随市场热度、相关性动态调整
- 处理外部接口返回的非结构化JSON时,优先用
dict.get(key, 默认值)的方式取值,替代直接用[]硬取键的写法,能大幅减少这类硬编码路径带来的报错
内容的提问来源于stack exchange,提问作者PythonNoobie
相关产品推荐
相关产品推荐

