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

Python从API返回JSON取值遇KeyError,如何提取悉尼交易所对应标的URL

问题根因

你触发KeyError: 'exchange'的核心原因是接口返回的JSON层级和你预设的访问路径完全不匹配:

  • 该搜索接口返回的articles数组存储的是和搜索词匹配的新闻内容,这类元素本身就不会携带exchange、symbol这类证券基础属性字段,自然找不到对应的键
  • 你要找的带exchange字段的证券条目,实际归类在返回结构的quotes数组下,而非articles数组
  • 就算路径匹配正确,搜索结果是按相关性排序的,数组首元素一般是市场关注度最高的标的(比如AMD的美股上市主体),你要找的Sydney交易所的Segue Resources只是结果列表里的靠后条目,固定取[0]索引也根本碰不到目标值
可落地的修正方案
  1. 请求时补充基础请求头,避免接口因为缺失通用校验信息拦截请求,返回非预期的错误结构
  2. 优先遍历存储证券条目的quotes数组,而非存新闻的articles数组
  3. 字典取值时用.get()方法做容错,不要硬取不存在的键,从根源上避免KeyError
  4. 全量遍历结果匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 07:45:03