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
相关产品推荐
相关产品推荐

