Selenium 4.11.2爬取报错:WebDriver无find_elements_by_class_name属性
解决Selenium 4.11.2中'WebDriver'无find_elements_by_class_name属性的问题
核心问题原因
Selenium 4.x版本已经彻底废弃了find_element_by_xxx和find_elements_by_xxx这类旧风格的API,你的报错就是因为还在调用这些已移除的方法,所以WebDriver对象找不到对应的属性。
具体修正方案
1. 导入必要的类
首先要导入By类,这是Selenium 4中指定定位方式的标准用法:
from selenium.webdriver.common.by import By
2. 替换所有旧的定位方法
把代码中所有find_element_by_class_name/find_elements_by_class_name替换成find_element(By.CLASS_NAME, "类名")或find_elements(By.CLASS_NAME, "类名")的格式。
3. 处理多类名的定位问题
你的代码里"vehicle-card__title mb-xs"是两个CSS类名,不能直接用CLASS_NAME定位(CLASS_NAME只能匹配单个类),需要改用CSS_SELECTOR,格式为.类名1.类名2。
4. 增加显式等待(可选但推荐)
页面加载需要时间,直接定位可能因为元素未渲染完成导致失败,建议添加显式等待确保元素加载完成。
修正后的完整代码
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 csv # 初始化驱动 driver = webdriver.Chrome() url = "https://www.freedomfordsales.ca/vehicles/used/?st=price,asc&view=grid&sc=used" driver.get(url) vehicle_data = [] try: # 显式等待车辆卡片加载完成,最多等10秒 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, "vehicle-card__full-details")) ) # 定位所有车辆卡片元素 vehicle_elements = driver.find_elements(By.CLASS_NAME, "vehicle-card__full-details") for element in vehicle_elements: # 用CSS_SELECTOR定位带多个类名的标题元素 vehicle_name = element.find_element(By.CSS_SELECTOR, ".vehicle-card__title.mb-xs").text.strip() # 定位价格元素 vehicle_price = element.find_element(By.CLASS_NAME, "srp__dealer-price").text.strip() vehicle_data.append([vehicle_name, vehicle_price]) finally: # 确保驱动关闭 driver.quit() # 写入CSV文件 csv_filename = "vehicle_data.csv" with open(csv_filename, mode="w", newline="", encoding="utf-8") as csv_file: csv_writer = csv.writer(csv_file) csv_writer.writerow(["Vehicle Name", "Price"]) for data in vehicle_data: csv_writer.writerow(data) print(f"CSV file '{csv_filename}' created successfully.")
额外说明
- 除了CLASS_NAME,其他定位方式(如ID、XPATH、CSS_SELECTOR)都需要改用
find_element(By.XXX, "定位值")的格式,比如find_element(By.ID, "xxx")。 - 显式等待比强制等待(time.sleep())更高效,能根据元素加载状态动态调整等待时间。
内容的提问来源于stack exchange,提问作者Tanman
相关产品推荐
相关产品推荐

