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

Selenium Python无法获取元素全部子元素,仅返回部分结果求助

解决Selenium仅获取部分表格子元素的问题

看起来你遇到的是典型的懒加载表格问题——很多网页会只加载可见区域的内容,当你滚动页面/表格到下方时才会动态加载剩下的行。30秒的固定等待确实没法触发这种动态加载,所以只能拿到初始渲染的14行。下面给你几个可行的解决方案:

1. 滚动表格到底部触发加载

如果表格本身带有滚动条(固定高度、内容超出时可滚动),你可以通过JavaScript滚动表格的滚动条,循环触发直到所有内容加载完成:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 用显式等待替代固定sleep,确保表格先加载完成
wait = WebDriverWait(browser, 30)
stocks_table = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "CI-GRID-BODY-TABLE-TBODY")))

# 循环滚动表格,直到没有新内容加载
last_scroll_height = browser.execute_script("return arguments[0].scrollHeight", stocks_table)
while True:
    # 滚动到当前表格的最底部
    browser.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", stocks_table)
    # 短时间等待新内容加载
    browser.implicitly_wait(2)
    # 获取新的表格高度
    new_scroll_height = browser.execute_script("return arguments[0].scrollHeight", stocks_table)
    # 如果高度不再变化,说明所有内容已加载
    if new_scroll_height == last_scroll_height:
        break
    last_scroll_height = new_scroll_height

# 现在获取所有tr元素
stock_list = stocks_table.find_elements(By.TAG_NAME, "tr")
print(f"总共获取到 {len(stock_list)} 个元素")
for stock in stock_list:
    print(stock.text)

2. 用显式等待替代固定sleep

固定的time.sleep(30)并不靠谱,因为网页加载速度受网络、设备性能影响。显式等待可以确保目标元素(或足够数量的子元素)加载完成后再执行操作:

wait = WebDriverWait(browser, 40)
# 等待至少200个tr元素出现(根据你的实际需求调整数量)
stock_list = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//tbody[@class='CI-GRID-BODY-TABLE-TBODY']/tr")))

print(len(stock_list))
for stock in stock_list:
    print(stock.text)

⚠️ 注意:如果表格是懒加载模式,初始不会渲染200个元素,这个方法需要结合滚动操作才能生效。

3. 检查是否存在嵌套iframe

有时候表格会被放在iframe里,这时候你需要先切换到iframe才能定位内部元素:

# 找到目标iframe(根据实际的id/name/class定位)
iframe = wait.until(EC.presence_of_element_located((By.ID, "your-iframe-id")))
# 切换到该iframe
browser.switch_to.frame(iframe)

# 之后再正常定位表格和子元素
stocks_table = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "CI-GRID-BODY-TABLE-TBODY")))
stock_list = stocks_table.find_elements(By.TAG_NAME, "tr")

额外排查小技巧

  • 打开浏览器开发者工具(F12),手动滚动表格,观察是否会加载新行,确认是不是懒加载导致的问题。
  • 如果表格没有独立滚动条,需要滚动整个页面的话,把JavaScript里的arguments[0]换成document.body或者document.documentElement即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:34:02