Python Selenium遍历URL数组提取商品销量报NoSuchElementException如何解决
问题原因
- 动态页面加载时序问题:Shopee的商品销量属于异步渲染内容,
driver.get()仅保证页面基础框架加载完成就会继续执行后续代码,第一个商品页加载速度快刚好渲染完销量元素,后续页面还没完成渲染就执行查找操作,因此抛出NoSuchElementException - API弃用警告:你使用的
find_element_by_css_selector是Selenium 4.0+版本已废弃的旧方法,需要替换为官方推荐的统一find_element写法消除警告。
修复方案
首先导入Selenium的等待与元素定位依赖包:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By
替换原有遍历代码:
urls=["https://shopee.com.my/Pantene-Shampoo-750ml-i.52968176.7669592698/","https://shopee.com.my/PureMAE-Ylang-Ylang-and-Grapefruit-Shampoo-250ML-i.238433989.4820842024/","https://shopee.com.my/Some-By-Mi-Cica-Peptide-Anti-Hair-Loss-Shampoo-285ml-Tonic-150ml-Treatment-50ml-i.18874494.3274522052/","https://shopee.com.my/-JULYME-Anti-Hair-Loss-Perfume-Hair-Shampoo-500ml-i.219158269.6815232839/"] # 初始化最长等待时间为10秒 wait = WebDriverWait(driver, 10) for url in urls: driver.get(url) # 可选:滚动页面触发元素渲染,部分站点元素需要进入视口才会加载 driver.execute_script("window.scrollTo(0, 400)") # 等待销量元素加载完成再提取文本 sales_ele = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.aca9MM'))) print(sales_ele.text)
可选优化
如果后续出现类名变更导致定位失效的情况,可以替换为更稳定的文本关联定位,比如定位包含「Sold」关键字的元素:
sales_ele = wait.until(EC.presence_of_element_located((By.XPATH, '//*[contains(text(),"Sold")]/span'))) # 实际使用时可以根据页面结构调整XPATH路径
内容的提问来源于stack exchange,提问作者CHEAH YI JO
相关产品推荐
相关产品推荐

