Python中BeautifulSoup爬取NVIDIA驱动版本为何输出异常?
问题原因与解决办法
问题根源
你用requests获取的是页面的原始静态HTML,而NVIDIA驱动页面的版本号是通过JavaScript动态渲染生成的。原始HTML中仅包含占位符~ddVersion_td~,并没有真实的版本数据,所以BeautifulSoup无法提取到你预期的版本号。
解决方法
方法1:用Selenium模拟浏览器渲染页面
Selenium会启动真实浏览器并执行页面的JavaScript,能获取到渲染后的完整内容:
- 先安装依赖:
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 url = "https://www.nvidia.com/en-us/drivers/" # 若驱动不在环境变量,可指定路径:webdriver.Chrome(executable_path="path/to/chromedriver") driver = webdriver.Chrome() driver.get(url) # 等待版本元素加载完成,最多等待10秒 version_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "version")) ) version_number = version_element.text print(f"Defined version number: {version_number}") expected_version = "572.83" if version_number != expected_version: print(f"Warning: Incorrect version ({version_number}) found instead of {expected_version}") # 关闭浏览器 driver.quit()
方法2:直接调用页面的API接口(更高效)
通过浏览器开发者工具(F12 → Network标签)观察页面加载时的XHR请求,能找到NVIDIA用来获取驱动版本数据的API接口。直接请求这个API可以避免模拟浏览器,效率更高:
import requests from bs4 import BeautifulSoup # 替换为你抓包找到的真实API地址 api_url = "https://www.nvidia.com/content/DriverDownload-March2009/confirmation.php?url=/Windows/572.83/572.83-desktop-win10-win11-64bit-international-dch-whql.exe&lang=en-us&type=GeForceRTX30Series" response = requests.get(api_url) # 根据API返回的格式解析版本号(示例,需根据实际返回调整) soup = BeautifulSoup(response.content, "html.parser") version_number = soup.find("span", class_="driver-version").text print(f"Defined version number: {version_number}") expected_version = "572.83" if version_number != expected_version: print(f"Warning: Incorrect version ({version_number}) found instead of {expected_version}")
注:API地址可能随NVIDIA网站更新变化,需要定期检查确认。
内容的提问来源于stack exchange,提问作者Ethan Schmidtke
相关产品推荐
相关产品推荐

