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

Selenium Python元素识别异常:非折扣商品复用折扣价格问题

问题分析与解决方案

不需要每次循环重启Driver,这只会降低爬取效率,问题根源在元素定位逻辑和异常处理缺失,具体原因和修复方案如下:

核心问题

  1. XPath定位错误:你在product-detail__left元素下用//div[@class='deleted__price']时,//是从整个文档根节点开始搜索,而非当前元素的子节点,容易匹配到页面残留的旧元素(即使页面刷新,Selenium偶尔会出现元素缓存问题)。
  2. 未处理无折扣场景:非折扣商品没有deleted__price元素,若不做异常判断,代码会抛出错误,而你可能未捕获该异常,导致复用了之前循环中保存的折扣价格值。
  3. 等待逻辑不精准:仅等待标题元素存在,不代表价格模块已完全加载,动态渲染的价格元素可能还未生成。

修复步骤

1. 修正XPath定位范围

在子元素查找时使用.//代替//,限制搜索范围为当前元素的上下文:

# 错误写法(全局搜索)
driver.find_element(By.XPATH, "//div[@class='product-detail__left']").find_element(By.XPATH, "//div[@class='deleted__price']")

# 正确写法(仅在当前容器内搜索)
left_container = driver.find_element(By.XPATH, "//div[@class='product-detail__left']")
deleted_price = left_container.find_element(By.XPATH, ".//div[@class='deleted__price']")

2. 增加异常处理与价格分支逻辑

针对无折扣商品的情况,捕获NoSuchElementException,区分折扣/非折扣场景:

from selenium.common.exceptions import NoSuchElementException

for link in links:
    driver.get(link)
    # 等待价格模块加载完成(比等待标题更精准)
    WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, "//div[@class='product-price__current']")))
    
    left_container = driver.find_element(By.XPATH, "//div[@class='product-detail__left']")
    original_price = None
    current_price = None
    
    # 尝试获取折扣前价格
    try:
        original_price = left_container.find_element(By.XPATH, ".//div[@class='deleted__price']").text.replace(",", ".")
    except NoSuchElementException:
        pass
    
    # 获取当前价格(无论是否有折扣都存在)
    current_price = left_container.find_element(By.XPATH, ".//div[@class='product-price__current']").text.replace(",", ".")
    
    # 输出结果
    if original_price:
        print(f"商品链接:{link},原价:{original_price},折扣价:{current_price}")
    else:
        print(f"商品链接:{link},当前价格:{current_price}")

3. 优化等待逻辑

将等待目标改为价格元素,确保价格模块已完全加载:

WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, "//div[@class='product-price__current']")))

额外建议

  • 每次循环后可调用driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")触发页面完整渲染,避免动态加载元素未出现。
  • 若遇到防爬限制,可在循环中添加随机延迟(如time.sleep(random.uniform(1,3))),降低被封禁风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:35:17