使用BeautifulSoup爬取网页:无法获取指定类的全部值
问题分析与解决方案
你的问题核心在于目标数据是通过JavaScript动态加载的——requests.get()只能获取页面初始的静态HTML,此时真实数值还未被JS渲染出来,所以你拿到的是页面预设的占位符--。下面提供两种可行的解决方法:
方法1:用Selenium模拟浏览器渲染页面
Selenium会模拟真实浏览器加载页面、执行JavaScript,能获取到完全渲染后的完整DOM内容。
步骤:
- 安装Selenium:
pip install selenium
- 下载对应浏览器的驱动(比如ChromeDriver,需和你的Chrome版本匹配),可将驱动路径配置到环境变量,或在代码中直接指定。
示例代码:
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 = "https://www.hvz.baden-wuerttemberg.de/pegel.html?id=00007" # 初始化Chrome浏览器驱动(用其他浏览器需替换对应驱动) driver = webdriver.Chrome() driver.get(url) try: # 等待目标元素加载完成,最多等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "da-spc.da-tmv")) ) # 获取渲染后的页面HTML soup = BeautifulSoup(driver.page_source, "html.parser") target_element = soup.find(class_="da-spc da-tmv") if target_element: full_text = target_element.get_text(strip=True) # 拆分文本提取所需数据 parts = full_text.split() if "W" in parts: w_index = parts.index("W") water_level = parts[w_index+1] # 提取372 date = parts[w_index+3] # 提取24.09.2023 print(f"水位数值: {water_level}") print(f"日期: {date}") print(f"完整内容: {full_text}") else: print("未找到目标元素") finally: # 关闭浏览器 driver.quit()
方法2:直接请求后台API(更高效)
动态加载的数据通常来自后台API接口,你可以通过浏览器开发者工具找到接口地址,直接请求获取结构化数据,无需渲染整个页面。
操作步骤:
- 打开目标网站,按F12打开开发者工具,切换到Network标签。
- 刷新页面,筛选XHR类型的请求,查找包含水位、日期数据的接口(比如路径含
pegel或data的请求)。 - 找到接口后,用
requests直接请求,解析返回的JSON数据即可。
示例(需替换为你查到的真实API地址):
import requests # 替换为你找到的真实API接口URL api_url = "https://www.hvz.baden-wuerttemberg.de/api/pegel/detail?id=00007" response = requests.get(api_url) if response.status_code == 200: data = response.json() # 根据API返回的JSON结构提取数据,示例结构仅供参考 daily_data = data["dailyAverage"] water_level = daily_data["value"] date = daily_data["date"] print(f"水位数值: {water_level}") print(f"日期: {date}") else: print("请求API失败")
注意事项
- 使用Selenium时,需确保浏览器驱动版本与浏览器版本一致,避免兼容性问题。
- 直接请求API时,部分网站会验证
User-Agent等请求头,可在requests.get()中添加headers={"User-Agent": "Mozilla/5.0..."}模拟浏览器请求。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

