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

