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

Selenium Python爬取BestBuy时遭遇NoSuchElementException错误求助

BestBuy戴尔XPS产品数据爬取:NoSuchElementException修复方案

问题说明

爬取BestBuy网站戴尔XPS产品的型号、价格及链接时,调用find_elements()出现NoSuchElementException,无法定位目标元素。原代码存在定位器错误、元素层级判断错误、动态ID依赖等问题。

错误原因分析

  • 动态ID依赖:原代码中使用的XPATH包含固定ID(如shop-sku-list-item-23022673),这类ID是网站动态生成的,每次访问都会变化,导致定位失败。
  • 元素层级错误:sku-value(型号元素)并不在sku-title节点下,直接从sku-title节点查找会找不到元素。
  • 多类名定位错误:使用By.CLASS_NAME定位多类名元素(如priceView-hero-price priceView-customer-price)会失效,因为CLASS_NAME不支持空格分隔的多类名,需用CSS_SELECTOR替代。
  • 等待时机不对:隐式等待应在浏览器初始化后立即设置,保证后续所有元素查找都能应用等待逻辑。

修正后的代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化浏览器
PATH = r"C:\Program Files (x86)\chromedriver.exe"  # 加r避免转义字符问题
driver = webdriver.Chrome(PATH)
driver.implicitly_wait(10)  # 全局隐式等待,初始化后立即设置
driver.get("https://www.bestbuy.com/")

# 搜索戴尔XPS
search = driver.find_element(By.NAME, 'st')
search.send_keys("dell xps")
search.send_keys(Keys.RETURN)

driver.maximize_window()

# 显式等待搜索结果加载完成
wait = WebDriverWait(driver, 20)
product_items = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.sku-item')))

# 准备存储数据
product_data = []

# 遍历每个产品项
for item in product_items:
    try:
        # 提取链接
        link_element = item.find_element(By.CSS_SELECTOR, '.sku-title a')
        product_link = link_element.get_attribute('href')
        
        # 提取型号
        model_element = item.find_element(By.CSS_SELECTOR, '.sku-value')
        product_model = model_element.text
        
        # 提取价格(处理价格可能存在的两种展示形式)
        try:
            price_element = item.find_element(By.CSS_SELECTOR, '.priceView-hero-price .priceView-customer-price')
            product_price = price_element.text
        except:
            price_element = item.find_element(By.CSS_SELECTOR, '.price-lockup .price')
            product_price = price_element.text
        
        product_data.append(f"型号: {product_model}\n价格: {product_price}\n链接: {product_link}\n---")
        print(f"型号: {product_model}\n价格: {product_price}\n链接: {product_link}\n---")
    except Exception as e:
        print(f"处理产品时出错: {e}")
        continue

# 将数据保存为文本文件
with open('dell_xps_products.txt', 'w', encoding='utf-8') as f:
    f.write('\n'.join(product_data))

time.sleep(5)
driver.quit()

代码说明

  • 使用显式等待确保搜索结果完全加载后再开始提取数据,避免因页面未加载完成导致的元素定位失败。
  • 用CSS_SELECTOR替代动态ID和多类名的定位,提升代码稳定性。
  • 遍历每个产品父节点(.sku-item),从父节点内定位子元素,保证元素层级正确。
  • 增加异常处理,避免单个产品提取失败导致整个程序中断。
  • 最后将爬取到的数据写入dell_xps_products.txt文件,保存为文本格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:07:25