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

Selenium爬取网页表格无法获取全部数据的问题排查与解决

问题排查与解决方法

问题根源

你遇到的空值问题确实是页面滚动加载机制导致的:页面仅渲染当前视口内的表格行数据,未滚动到的行虽然存在于DOM中,但单元格内容并未实际加载,因此text属性为空,最终生成空行。

解决步骤

1. 实现滚动加载所有表格行

首先需要滚动页面/表格容器,触发所有行的内容加载。可以通过以下两种方式实现:

方式一:滚动表格容器(推荐)

如果表格在独立的滚动容器内(而非整个页面滚动),找到容器元素后循环滚动到底部:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 替换为实际页面的表格滚动容器选择器(比如CSS_SELECTOR)
table_container = driver.find_element(By.CSS_SELECTOR, "sgx-table") 

last_height = driver.execute_script("return arguments[0].scrollHeight;", table_container)
while True:
    # 滚动到容器底部
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight;", table_container)
    # 等待内容加载,可根据页面速度调整时长
    time.sleep(2)
    new_height = driver.execute_script("return arguments[0].scrollHeight;", table_container)
    # 高度不再变化时,说明所有内容已加载
    if new_height == last_height:
        break
    last_height = new_height

方式二:滚动整个页面

如果表格随页面滚动加载,直接滚动页面:

last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

2. 优化数据提取逻辑

原代码的初始化和循环逻辑可以简化,同时确保提取到加载后的内容:

from selenium.webdriver.common.by import By
import pandas as pd

# 滚动完成后,等待所有行加载完毕
rows = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.TAG_NAME, 'sgx-table-row'))
)

combined = []
for row in rows:
    row_data = []
    # 提取ticker链接文本
    for t in row.find_elements(By.TAG_NAME, 'a'):
        text = t.text.strip()
        row_data.append(text if text else '-')
    # 提取文本单元格
    for cell in row.find_elements(By.TAG_NAME, 'sgx-table-cell-text'):
        text = cell.text.strip()
        row_data.append(text if text else '-')
    # 提取数字单元格
    for cell in row.find_elements(By.TAG_NAME, 'sgx-table-cell-number'):
        text = cell.text.strip()
        row_data.append(text if text else '-')
    combined.append(row_data)

df = pd.DataFrame(combined)
print(df)

额外注意事项

  • 替换滚动容器选择器:需要根据实际页面HTML结构,找到带有overflow: auto/scroll属性的表格父容器,替换示例中的选择器。
  • 替换固定等待:time.sleep()可改为WebDriverWait等待新行出现,让代码更稳定,比如等待新增的sgx-table-row元素。
  • 重复滚动验证:部分页面可能需要多次滚动才能加载全部内容,通过判断滚动高度是否变化是最可靠的验证方式。

内容的提问来源于stack exchange,提问作者smexy123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:36:20