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

Python调用API获取JSON时无法读取Variants字段求助

Sonos API JSON读取"variants"字段触发KeyError问题解决

调用Sonos的API获取JSON数据时,尝试读取"variants"字段,执行代码后先输出部分结果,随后出现KeyError: 'variants'错误。

原代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
import json

URL = "https://www.sonos.com/de-at/getproductpricejson?pid=sub-mini,ray,roam,roam-sl,arc,five,sub,move,one,one-sl,beam,port,amp,boost,ceiling-speaker-pair,wall-speaker-pair,outdoor-speaker-pair,two-room-set-roam,roam-and-wireless-charger-set,roam-sl-and-wireless-charger-set,portable-set-move-roam,2-room-music-system-one,indoor-outdoor-set,two-room-set-one-sl,two-room-pro-five,mounted-ray-set,beam-mount-set,arc-mount-set,two-room-set-ray-roam,surround-set-ray-one-sl-pair,surround-set-beam-one-sl-pair,surround-set-arc-one-sl-pair,entertainment-set-ray-sub-mini,entertainment-set-beam-sub-mini,3-1-entertainment-set-beam-sub,entertainment-set-arc-sub,multiroom-entertainment-set-arc-and-move,immersive-set-ray-sub-mini-one-sl,immersive-set-beam-sub-mini-one-sl,5-1-surround-set-beam-sub-one-sl,surround-set-arc-sub-one-sl,amp-and-ceiling-set,amp-and-wall-set,amp-and-outdoor-set,vinyl-set-five-pro-ject-t1-turntable,wall-mount-one-play1,wall-mount-one-play1-pair,shelf-one-play1,speaker-stand-pair-one-play1,wall-hook"

r = requests.get(URL)
page = r.json()

print(page)

for element in page:
#print(element)
print(element["variants"])

错误信息

print(element["variants"])
KeyError: 'variants'

问题原因

API返回的JSON数组中,并非所有产品条目都包含variants字段,直接通过element["variants"]索引不存在的键会触发KeyError。

解决方法

方法1:使用字典get()方法(推荐)

get()方法允许指定键不存在时的默认返回值,避免报错:

import requests
import json

URL = "https://www.sonos.com/de-at/getproductpricejson?pid=sub-mini,ray,roam,roam-sl,arc,five,sub,move,one,one-sl,beam,port,amp,boost,ceiling-speaker-pair,wall-speaker-pair,outdoor-speaker-pair,two-room-set-roam,roam-and-wireless-charger-set,roam-sl-and-wireless-charger-set,portable-set-move-roam,2-room-music-system-one,indoor-outdoor-set,two-room-set-one-sl,two-room-pro-five,mounted-ray-set,beam-mount-set,arc-mount-set,two-room-set-ray-roam,surround-set-ray-one-sl-pair,surround-set-beam-one-sl-pair,surround-set-arc-one-sl-pair,entertainment-set-ray-sub-mini,entertainment-set-beam-sub-mini,3-1-entertainment-set-beam-sub,entertainment-set-arc-sub,multiroom-entertainment-set-arc-and-move,immersive-set-ray-sub-mini-one-sl,immersive-set-beam-sub-mini-one-sl,5-1-surround-set-beam-sub-one-sl,surround-set-arc-sub-one-sl,amp-and-ceiling-set,amp-and-wall-set,amp-and-outdoor-set,vinyl-set-five-pro-ject-t1-turntable,wall-mount-one-play1,wall-mount-one-play1-pair,shelf-one-play1,speaker-stand-pair-one-play1,wall-hook"

r = requests.get(URL)
page = r.json()

for element in page:
    # 不存在variants时返回指定提示
    variants = element.get("variants", "该产品无variants字段")
    print(variants)

方法2:先检查字段是否存在

通过in关键字判断键是否存在,再进行访问:

import requests
import json

URL = "https://www.sonos.com/de-at/getproductpricejson?pid=sub-mini,ray,roam,roam-sl,arc,five,sub,move,one,one-sl,beam,port,amp,boost,ceiling-speaker-pair,wall-speaker-pair,outdoor-speaker-pair,two-room-set-roam,roam-and-wireless-charger-set,roam-sl-and-wireless-charger-set,portable-set-move-roam,2-room-music-system-one,indoor-outdoor-set,two-room-set-one-sl,two-room-pro-five,mounted-ray-set,beam-mount-set,arc-mount-set,two-room-set-ray-roam,surround-set-ray-one-sl-pair,surround-set-beam-one-sl-pair,surround-set-arc-one-sl-pair,entertainment-set-ray-sub-mini,entertainment-set-beam-sub-mini,3-1-entertainment-set-beam-sub,entertainment-set-arc-sub,multiroom-entertainment-set-arc-and-move,immersive-set-ray-sub-mini-one-sl,immersive-set-beam-sub-mini-one-sl,5-1-surround-set-beam-sub-one-sl,surround-set-arc-sub-one-sl,amp-and-ceiling-set,amp-and-wall-set,amp-and-outdoor-set,vinyl-set-five-pro-ject-t1-turntable,wall-mount-one-play1,wall-mount-one-play1-pair,shelf-one-play1,speaker-stand-pair-one-play1,wall-hook"

r = requests.get(URL)
page = r.json()

for element in page:
    if "variants" in element:
        print(element["variants"])
    else:
        # 可选:输出产品ID方便定位
        print(f"产品ID {element.get('pid')} 无variants字段")

内容的提问来源于stack exchange,提问作者pascal probst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:52:40