Python下Selenium/BeautifulSoup/Pandas爬取EIB动态表格失败咨询
问题根本原因
- 静态抓取类方法失效的核心:
requests请求、pd.read_html读取URL的逻辑,只会获取服务器返回的初始静态HTML文件,该页面的表格内容是前端JS异步请求渲染后插入DOM的,初始静态文件中根本不存在对应的表格节点,因此BeautifulSoup从静态HTML里找<tr>标签会返回空列表,pd.read_html也会直接抛出“未找到表格”的错误。 - Selenium使用逻辑的硬伤:代码中调用
driver.get(URL)后没有做任何页面渲染等待,浏览器刚打开页面、JS还没执行完异步表格加载逻辑时就立刻抓取DOM元素,此时页面中还不存在<td>节点,自然返回空列表。另外代码存在逻辑混用问题:用requests获取的静态页面对象初始化的soup,去解析Selenium拿到的渲染后页面源,解析逻辑完全错位。 - 代码细节错误:Selenium定位部分存在语法笔误
e.tex,正确属性应为e.text;同时使用了已在新版Selenium中弃用的旧版定位APIfind_elements_by_xpath,存在版本兼容性问题。
修复实现方案
- 调整代码逻辑:放弃用静态请求的源做解析,完全基于Selenium渲染完成的页面内容做处理,通过显式等待确保目标表格节点真正加载后再抓取DOM,避免空列表问题。
- 解析环节优化:拿到浏览器渲染后的完整HTML字符串后,直接传入
pd.read_html解析为DataFrame,不需要额外拼接BeautifulSoup解析逻辑。 - 稳定性优化:用显式等待替换硬编码的等待时间,适配页面的动态加载节奏,减少因网络波动导致的抓取失败。
修正后的可运行示例代码
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import pandas as pd # 替换为本地GeckoDriver的实际存储路径 driver = webdriver.Firefox(executable_path='/你的本地驱动路径') target_url = 'https://www.eib.org/en/about/procurement/index.htm' driver.get(target_url) # 显式等待:检测到目标表格元素出现在DOM中后再继续执行,最长等待15秒 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CSS_SELECTOR, '页面表格的实际CSS选择器')) ) # 获取浏览器完全渲染后的页面源码 rendered_page = driver.page_source # 直接基于渲染后的HTML解析表格,得到DataFrame列表 table_df_list = pd.read_html(rendered_page) # 取列表中第一个目标表格,即为需要的采购内容 procurement_data = table_df_list[0] # 爬取完成后关闭浏览器进程 driver.quit()
注意事项
- 等待环节的CSS选择器,可以通过浏览器开发者工具检查目标表格的实际类名、标签属性替换,确保等待条件匹配正确的节点。
- 若后续需要抓取分页加载的内容,可以在等待表格加载完成后,补充Selenium的翻页点击逻辑,逐页抓取渲染后的HTML解析表格,最后合并所有分页的DataFrame即可。
- 不要混用静态请求的HTML源和Selenium的渲染后HTML源,两个来源的页面内容结构存在本质差异,混用逻辑会直接导致解析结果为空。
内容的提问来源于stack exchange,提问作者Fatima El Mansouri
相关产品推荐
相关产品推荐

