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

如何遍历CVS网站商品下拉列表并获取所有选项URL?

问题描述

我正在编写网页爬虫脚本,用于爬取CVS网站上某一品牌的商品。目前卡在单个商品页面的多规格/包装下拉列表处理环节:需要遍历列表中的所有规格并获取每个选项的URL,但仅能获取列表中的第二个选项URL,或完全获取不到结果。

网页检查时定位到的下拉区块截图:
下拉区块截图

以下是我的代码,运行后仅打印下拉框中第二个选项的URL:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://www.cvs.com/shop/aveeno-daily-moisturizing-lotion-prodid-1013347?skuId=515049')
driver.maximize_window()
driver.implicitly_wait(15)

dropdown = driver.find_element(By.CLASS_NAME, "search_select")
dropdown.click()
options = dropdown.find_elements(By.XPATH, '//div[@class="select-dropdownContainer dswatchesMenuContainer"]')

for option in options:
    option.click()
    driver.implicitly_wait(2)
    print(driver.current_url)

我尝试过将options变量的定位条件替换为:
//ul[@class="variantsWithoutColorSwatchMobileContainer"](By.XPATH),结果仍仅返回第二个选项的URL;
替换为以下两种CSS_SELECTOR时,完全没有结果:

By.CSS_SELECTOR, 'li.select-option.select-optionRow',

By.CSS_SELECTOR, 'div.select-dropdownContainer.dswatchesMenuContainer'

请问如何获取下拉框中所有选项的URL?我的代码哪里出错了?


问题分析与解决办法

核心错误点

  1. 元素定位逻辑错误:使用dropdown.find_elements()时,XPath开头的//会从整个文档根节点查找,而非限定在dropdown节点范围内,导致只定位到下拉容器而非单个选项。
  2. 页面跳转导致元素失效:点击选项后页面会刷新,初始获取的options列表会变成失效元素(StaleElementReferenceException),所以仅能成功执行一次点击,表现为只拿到第二个URL。
  3. 隐式等待的局限性:隐式等待是全局设置,无法精准等待特定元素加载完成,容易出现元素未就绪就操作的情况。

修正后的代码

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

driver = webdriver.Chrome()
driver.get('https://www.cvs.com/shop/aveeno-daily-moisturizing-lotion-prodid-1013347?skuId=515049')
driver.maximize_window()
wait = WebDriverWait(driver, 15)

# 等待下拉框可点击并展开
dropdown = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "search_select")))
dropdown.click()

# 等待所有选项加载完成,定位单个选项元素
options = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "li.select-option.select-optionRow")))

# 直接从选项的data-url属性提取URL,无需跳转
all_urls = []
for opt in options:
    url = opt.get_attribute("data-url")
    if url:
        all_urls.append(url)

# 输出所有规格的URL
for url in all_urls:
    print(url)

driver.quit()

关键优化说明

  • 精准定位选项:使用li.select-option.select-optionRow直接定位单个规格选项,确保遍历所有可点击的选项元素。
  • 读取属性替代页面跳转:CVS的规格选项会将目标URL存储在data-url属性中,直接读取该属性既避免了页面跳转导致的元素失效问题,又大幅提升爬取效率。
  • 显式等待替代隐式等待:显式等待可以针对特定元素设置等待条件,确保元素完全就绪后再操作,解决网络延迟或页面渲染慢导致的元素未找到问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:05:23