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

使用Beautiful Soup爬取中国天气网数据的类匹配异常问题

问题原因与解决办法

核心原因

你遇到的问题本质是页面数据动态渲染:

  • 浏览器开发者工具看到的sk mySkyNull内容,是页面加载后通过JavaScript动态生成并插入DOM的;而requests库获取的是服务器直接返回的原始HTML,此时这个div的内容还未生成,只有空的sk占位div。
  • 另外你的链式查找存在风险:如果中间某一步find返回None,后续调用.find()会直接抛出AttributeError,导致代码中断。

解决办法

方法1:模拟浏览器渲染(用Selenium)

通过模拟浏览器加载页面,等待JS执行完成后再获取完整的DOM结构:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

url = "http://www.weather.com.cn/weather1d/101210301.shtml"

# 初始化Chrome浏览器(需提前配置对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get(url)

# 等待目标元素加载完成(最多等待10秒)
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "mySkyNull"))
    )
    # 获取渲染后的完整页面源码
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    target_div = soup.find('div', class_='sk mySkyNull')
    print(target_div.get_text(strip=True))
finally:
    driver.quit()

方法2:直接调用API接口(更高效)

中国天气网的天气数据通过API接口加载,直接请求接口比解析HTML更可靠。以下是对应杭州(城市ID:101210301)的实时天气接口调用示例:

import requests
import json

url = "http://d1.weather.com.cn/sk_2d/101210301.html"
headers = {
    'user-agent': 'Mozilla/5.0',
    'Referer': 'http://www.weather.com.cn/'  # 必须添加Referer,否则接口会拒绝请求
}

response = requests.get(url, headers=headers)
# 接口返回格式为var dataSK = {...},需处理为标准JSON
data_str = response.text.split('=')[1].strip()[:-1]
data = json.loads(data_str)

# 打印核心天气数据
print(f"实时温度:{data['temp']}℃")
print(f"湿度:{data['SD']}")
print(f"风向风力:{data['WD']} {data['WS']}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:17:14