Selenium通过XPath查找元素仅前15个非空其余为空,如何获取全部元素?
问题原因
Shopee平台采用虚拟滚动(懒加载)的页面渲染逻辑:所有商品的DOM节点会提前挂载到页面中,因此你获取的product_list长度和实际商品数量一致,但只有进入浏览器可视区域的商品节点才会被注入实际的文本、图片等内容,未出现在视口的节点内容默认为空,因此只有首屏的前15个商品可以拿到非空文本。
解决方法
需要先模拟页面滚动,触发所有商品节点的内容渲染,再统一提取商品文本:
- 先通过JS脚本模拟页面逐段滚动到底部,每次滚动后预留足够时间等待商品内容加载
- 待所有商品都完成渲染后,再遍历
product_list提取文本内容
修改后的完整代码
import time 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 # 路径前加r避免转义字符报错 chromeDriverPath = r'C:\Program Files (x86)\chromedriver.exe' url = 'https://shopee.vn/Th%E1%BB%9Di-Trang-Nam-cat.11035567?page=0' driver = webdriver.Chrome(executable_path=chromeDriverPath) driver.get(url) try: main_xpath = '/html/body/div[1]/div/div[3]/div/div[4]/div[2]/div/div[2]' main = WebDriverWait(driver,20).until( EC.presence_of_element_located((By.XPATH,main_xpath)) ) product_list = main.find_elements(By.XPATH,'./div[@data-sqe="item"]') # 模拟滚动到底部,触发所有商品渲染 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待2秒让商品内容加载完成,可根据网络情况调整时长 time.sleep(2) new_height = driver.execute_script("return document.body.scrollHeight") # 滚动到最底部没有高度变化时,终止滚动 if new_height == last_height: break last_height = new_height # 所有商品渲染完成后再提取文本 for i in range(0,len(product_list)): print(i) print(product_list[i].text) finally: driver.close()
可选优化
如果滚动后还是有部分内容为空,可以改为逐个滚动到每个商品节点再提取内容,确保每个节点都被触发渲染:
for i in range(0,len(product_list)): # 滚动到当前商品节点 driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", product_list[i]) time.sleep(0.5) print(i) print(product_list[i].text)
内容的提问来源于stack exchange,提问作者Ngọc An
相关产品推荐
相关产品推荐

