You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:57:04