使用Selenium抓取Carmax网站库存返回空数组的问题求助
解决Selenium抓取Carmax库存数量返回空数组的问题
问题描述
用Python Selenium脚本抓取Carmax网站的库存数量(页面显示如44,015、45,475),但执行代码后print返回空数组[]。代码通过By.CLASS_NAME定位类为header-value hzn-typography--body-1的元素,该元素在页面可见,却无法定位到目标元素。
页面HTML示例
<div class="number-of-matches"> <span class="header-value hzn-typography--body-1">45,475</span> <span class="header-label"> Matches</span></div>
用户原代码
import socket import os import json import certifi import ssl import certifi import smtplib from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver=webdriver.Chrome() driver.get("https://www.carmax.com") time.sleep(8) try: if driver.find_element(By.ID, "header-search-button"): driver.find_element(By.ID, "header-search-button").click() time.sleep(25) inventory = driver.find_elements(By.CLASS_NAME, 'header-value hzn-typography--body-1') print(inventory) except: time.sleep(3)
解决方法
By.CLASS_NAME不支持多类名:Selenium的By.CLASS_NAME只能传入单个类名,不能用空格分隔多个类。原代码中'header-value hzn-typography--body-1'是两个类,导致定位失败。可替换为CSS选择器:By.CSS_SELECTOR, '.header-value.hzn-typography--body-1',或仅使用其中一个唯一类名(如'header-value')。替换强制等待为显式等待:
time.sleep()属于强制等待,稳定性差,易因页面加载速度波动导致元素未加载完成。改用WebDriverWait显式等待元素出现,确保元素可被定位后再操作。处理潜在干扰元素:页面可能存在Cookie弹窗、广告等遮挡元素,需先处理这类弹窗(如点击同意按钮),避免影响元素定位。
优化代码冗余:删除未使用的模块(如
socket、smtplib等),简化逻辑;原代码中if driver.find_element(...)会在元素不存在时抛出异常,建议用find_elements判断元素是否存在,或直接尝试点击并捕获异常。
修改后的示例代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Chrome() driver.get("https://www.carmax.com") try: # 等待搜索按钮可点击并执行点击 search_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.ID, "header-search-button")) ) search_btn.click() # 等待库存数量元素加载完成,获取文本内容 inventory_element = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, '.header-value.hzn-typography--body-1')) ) print(inventory_element.text) except Exception as e: print(f"执行出错: {e}") finally: # 确保浏览器关闭 driver.quit()
内容的提问来源于stack exchange,提问作者JasonH
相关产品推荐
相关产品推荐

