Selenium用XPath定位表格元素仅返回HTML源码内部分元素如何解决
问题根源
目标站点的表格使用 jQuery DataTables 组件实现,默认仅会将当前分页的10条数据渲染为真实DOM节点,其余分页数据仅存储在前端JS变量中,不会插入DOM树,因此直接通过XPath查找DOM元素只能拿到当前页的10条结果,滚动、等待都不会生效。
解决方案
提供两种可落地的实现方式:
方案1:模拟分页点击逐页抓取
通过Selenium模拟点击表格底部的下一页按钮,逐页采集当前页的灵敏度数据,直到下一页按钮禁用为止。
代码示例:
import selenium 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 selenium.common.exceptions import TimeoutException PATH = r"your own chromedriver path here" driver = webdriver.Chrome(executable_path = PATH) driver.get("https://prosettings.net/cs-go-pro-settings-gear-list/") wait = WebDriverWait(driver, 10) all_sens = [] while True: # 等待当前页数据加载完成 current_rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, '//table[@id="table_1"]/tbody/tr/td[8]'))) for row in current_rows: all_sens.append(row.get_attribute('innerHTML').strip()) # 查找下一页按钮 try: next_btn = wait.until(EC.element_to_be_clickable((By.ID, 'table_1_next'))) # 判断下一页是否已禁用 if 'disabled' in next_btn.get_attribute('class'): break next_btn.click() # 等待页面切换后表格刷新 wait.until(EC.staleness_of(current_rows[0])) except TimeoutException: break # 输出所有结果 for sens in all_sens: print(sens) print(f"共抓取到{len(all_sens)}条数据") driver.close()
方案2:直接调用JS读取全量数据(更高效)
DataTables组件的全量数据会存储在前端实例中,直接执行JS脚本即可一次性取出所有数据,无需模拟分页,速度更快、稳定性更高。
代码示例:
import selenium 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 PATH = r"your own chromedriver path here" driver = webdriver.Chrome(executable_path = PATH) driver.get("https://prosettings.net/cs-go-pro-settings-gear-list/") # 等待表格初始化完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.ID, 'table_1'))) # 执行JS读取DataTables全量数据,第7个索引对应第8列(从0开始计数) all_sens = driver.execute_script("return $('#table_1').DataTable().data().toArray().map(item => item[7])") # 输出所有结果 for sens in all_sens: print(sens.strip()) print(f"共抓取到{len(all_sens)}条数据") driver.close()
内容的提问来源于stack exchange,提问作者Wesley P. Crusher
相关产品推荐
相关产品推荐

