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

Python Selenium类元素爬取网站失败:问题排查与优化

问题分析与解决方案

核心错误原因

你遇到的InvalidArgumentException是因为定位器参数格式错误:driver.find_element()方法需要同时指定定位策略(比如类名、XPATH等)和定位值,而你只传了类名字符串,Selenium无法识别定位方式。除此之外,代码还有几处关键问题导致无法正确爬取数据:

具体问题与修正点

  • 定位器格式错误:必须显式指定定位策略,比如用By.CLASS_NAME来声明通过类名定位元素
  • 过时API使用:find_elements_by_xpath是Selenium旧版本的写法,新版本(4.x+)建议使用find_elements(By.XPATH, 'xxx')的形式
  • 绝对XPATH不可靠:硬编码的绝对XPATH会因为页面结构微小变化失效,应该用相对路径定位每个课程项
  • 固定等待不灵活:time.sleep(5)无法保证元素完全加载,改用显式等待更稳定

修正后的代码

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

url = "https://www.classcentral.com/collection/top-free-online-courses"

driver = webdriver.Chrome()
driver.get(url)

# 显式等待课程列表加载完成,最多等待10秒
wait = WebDriverWait(driver, 10)
course_list = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'course-list--row')))

# 遍历每个课程项,提取课程名称
for course in course_list:
    # 用相对XPATH定位当前课程的标题元素
    course_title = course.find_element(By.XPATH, './/div[@class="col-md-8"]//h2/a').text
    print(course_title)

driver.quit()

代码说明

  1. 显式等待:使用WebDriverWait等待课程列表元素加载,避免因页面加载慢导致的元素找不到问题
  2. 相对定位:遍历每个课程项时,用.开头的相对XPATH定位当前课程内的标题,确保只获取当前课程的数据
  3. 正确的定位策略:通过By.CLASS_NAME和By.XPATH明确指定定位方式,符合Selenium 4.x+的API规范
  4. 稳定的元素选择:选择course-list--row作为课程项的类名,这个类名是每个课程项的统一容器,比你之前用的search-results__blanket更精准

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:33:12