Python Selenium提取商品a标签href值时选择器返回空列表的问题
Selenium提取Foot Locker乔丹品类页商品href的可落地方案
原有定位方式失效的核心原因
- 定位时机不匹配:商品列表为动态懒加载渲染,初始页面DOM加载完成时,目标a标签尚未注入文档树,直接定位必然返回空列表
- 类名匹配规则错误:原有CSS、XPath写法均为类名全值精确匹配,实际页面的类名可能附带动态生成的额外值、类顺序调整,导致匹配失配
- 未触发全量内容渲染:页面需要滚动操作才会加载后续商品卡片,仅初始状态下的DOM仅包含少量首屏元素
分步实现代码
- 引入Selenium标准定位与等待模块,替换旧版废弃的定位API
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 import time # 初始化driver后配置显式等待实例,替代硬编码sleep wait = WebDriverWait(driver, 15) - 等待外层商品容器渲染完成,确认文档流已经加载到商品区域
# 等待class包含product-container的li元素出现,替代全值匹配类名的写法 wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "li[class*='product-container']")) ) - 滚动触发全量懒加载内容,确保20余个商品全部渲染完成
last_count = 0 base_url = "https://www.footlocker.com" current_elems = [] while True: # 执行JS滚动到页面最底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") time.sleep(1.2) # 统计当前页面的目标a标签数量 current_elems = driver.find_elements(By.CSS_SELECTOR, "a[class*='ProductCard-link'][href]") current_count = len(current_elems) # 数量连续两次无增长、或达到预期的20余个商品阈值时,停止滚动 if current_count == last_count or current_count >= 25: break last_count = current_count - 批量提取并清洗href值
product_link_list = [] for elem in current_elems: # 提取相对路径,同时清洗示例HTML中存在的换行、空格字符 raw_href = elem.get_attribute("href").replace("\n", "").replace(" ", "") product_link_list.append(f"{base_url}{raw_href}")
避坑提示
- 不要使用Selenium 4以上版本已废弃的
find_elements_by_css_selector、find_elements_by_xpath旧API,统一使用By枚举传参的写法,避免兼容性问题 - 提取href值时必须做字符串清洗,示例HTML中的href值存在换行、断行的格式问题,直接取值会得到带无效空白字符的错误路径
- 如果定位时仍返回空列表,先检查页面是否被重定向到人机验证、地区选择前置页,这类场景下商品列表DOM结构会完全变更,需要先完成前置交互再开展定位
内容的提问来源于stack exchange,提问作者starlord
相关产品推荐
相关产品推荐

