Python天气应用解析雅虎API返回JSON温度字段失败问题求助
温度提取报错解决方案
问题原因
根据你提供的接口返回JSON结构,温度字段并不在location同级下,而是嵌套在更深的层级,直接取错路径就会触发KeyError报错。
各温度值的提取路径如下:
- 实时温度:
json_data["current_observation"]["condition"]["temperature"] - 当日最低温:
json_data["forecasts"][0]["low"] - 当日最高温:
json_data["forecasts"][0]["high"]
修改代码
你只需要调整clicked_2函数的逻辑,补充温度提取和显示的代码即可,同时增加基础异常处理避免程序闪退,修改后的函数如下:
def clicked_2(): # 先校验输入不为空 lat = ent1_lot.get().strip() lng = ent2_lot.get().strip() if not lat or not lng: messagebox.showwarning("输入错误", "请填写完整的经纬度信息") return url = "https://yahoo-weather5.p.rapidapi.com/weather" querystring = {"lat": lat, "long": lng, "format": "json", "u": "c"} # 注意这里要替换成你自己的RapidAPI密钥 headers = { 'x-rapidapi-host': "yahoo-weather5.p.rapidapi.com", 'x-rapidapi-key': "你自己的RapidAPI Key填这里" } try: response = requests.request("GET", url, headers=headers, params=querystring) # 校验接口请求成功 response.raise_for_status() json_data = json.loads(response.text) # 提取位置信息 location = json_data['location'] city = location['city'] country = location['country'] # 提取温度信息 current_temp = json_data["current_observation"]["condition"]["temperature"] today_low = json_data["forecasts"][0]["low"] today_high = json_data["forecasts"][0]["high"] weather_desc = json_data["current_observation"]["condition"]["text"] # 显示信息 lbl_ci = Label(root, text=city) lbl_ci['font'] = "Montserrat 20" lbl_ci['fg'] = "gold" lbl_ci.place(x=400, y=340) lbl_c = Label(root, text=country) lbl_c['font'] = "Montserrat 20" lbl_c['fg'] = "gold" lbl_c.place(x=400, y=300) # 新增温度显示 lbl_temp = Label(root, text=f"当前温度:{current_temp}℃") lbl_temp['font'] = "Montserrat 20" lbl_temp['fg'] = "gold" lbl_temp.place(x=400, y=380) lbl_temp_range = Label(root, text=f"今日温度范围:{today_low}℃ ~ {today_high}℃") lbl_temp_range['font'] = "Montserrat 20" lbl_temp_range['fg'] = "gold" lbl_temp_range.place(x=400, y=420) lbl_desc = Label(root, text=f"天气状况:{weather_desc}") lbl_desc['font'] = "Montserrat 20" lbl_desc['fg'] = "gold" lbl_desc.place(x=400, y=460) except Exception as e: messagebox.showerror("请求失败", f"获取天气信息出错:{str(e)}")
注意事项
- 必须将
headers中的x-rapidapi-key替换为你自己在RapidAPI平台申请的密钥,否则接口会返回权限错误,导致解析失败 - 上述代码增加了输入校验和异常捕获,就算接口返回异常也不会直接导致程序崩溃
内容的提问来源于stack exchange,提问作者Artani
相关产品推荐
相关产品推荐

