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
相关产品推荐
相关产品推荐

