如何遍历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?我的代码哪里出错了?
问题分析与解决办法
核心错误点
- 元素定位逻辑错误:使用
dropdown.find_elements()时,XPath开头的//会从整个文档根节点查找,而非限定在dropdown节点范围内,导致只定位到下拉容器而非单个选项。 - 页面跳转导致元素失效:点击选项后页面会刷新,初始获取的
options列表会变成失效元素(StaleElementReferenceException),所以仅能成功执行一次点击,表现为只拿到第二个URL。 - 隐式等待的局限性:隐式等待是全局设置,无法精准等待特定元素加载完成,容易出现元素未就绪就操作的情况。
修正后的代码
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
相关产品推荐
相关产品推荐

