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

如何使用Python的Beautiful Soup定位爬取到的真实天气数据?

问题解决说明

你当前的代码有三个核心问题导致无法稳定获取到正确的天气数据:

  • 未配置请求头UA,站点大概率识别到爬虫请求,返回的HTML和浏览器正常访问的DOM结构不一致
  • 用了站点自动生成的带哈希后缀的动态类名定位元素,这类类名会随站点版本更新频繁变更,完全不可靠
  • 直接将元素对象转字符串后按固定索引切片取内容,DOM结构稍有变动就会拿到错误文本
修正后的代码实现
import requests
from bs4 import BeautifulSoup
from win10toast import ToastNotifier

n = ToastNotifier()

def getdata(url):
    # 配置模拟浏览器的请求头,避免被反爬拦截
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    }
    r = requests.get(url, headers=headers)
    r.encoding = r.apparent_encoding
    return r.text

htmldata = getdata("https://weather.com/en-IN/weather/today/l/cbaac1d32c1c53fb17b70538d11fb0f7a9b126f58b9515261d847f28c846d32c")
soup = BeautifulSoup(htmldata, 'html.parser')

# 用稳定的data-testid属性定位,比动态类名可靠得多
current_temp_ele = soup.find("span", {"data-testid": "TemperatureValue"})
chances_rain_ele = soup.find("span", {"data-testid": "PrecipitationProbabilityValue"})

# 先判断元素是否成功获取,避免空值报错
if current_temp_ele and chances_rain_ele:
    current_temp = current_temp_ele.text
    chances_rain = chances_rain_ele.text
    result = f"当前城市气温:{current_temp}\n降水概率:{chances_rain}"
    n.show_toast("实时天气更新", result, duration = 15)
else:
    print("天气数据获取失败,请检查页面结构是否变更")

input()
后续优化建议
  • 可以定位页面内的城市名称元素,替换掉固定的城市文本,让通知内容更准确
  • 可以增加异常捕获逻辑,处理网络请求失败、元素不存在等异常场景
  • 如果后续该站点结构频繁变更导致爬虫失效,可以换成公开的天气接口获取数据,稳定性远高于爬虫

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:45:03