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

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)}")

注意事项

  1. 必须将headers中的x-rapidapi-key替换为你自己在RapidAPI平台申请的密钥,否则接口会返回权限错误,导致解析失败
  2. 上述代码增加了输入校验和异常捕获,就算接口返回异常也不会直接导致程序崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:00:01