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

