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

《Python编程快速上手》Selenium网页抓取代码失效,求2023适配方案

解决方案:适配当前网站的Selenium元素定位代码

问题根源

  1. 多类名定位逻辑错误:By.CLASS_NAME不支持同时指定多个类名(无论用空格还是点分隔都无效),这是你之前尝试失败的核心原因之一。
  2. 网站DOM结构更新:原书中的目标元素类名已发生变更,且页面采用动态加载机制,直接执行查找操作会因元素未完成渲染而失败。

正确实现步骤

1. 确认目标元素的当前选择器

打开目标网站开发者工具(F12),定位到书籍封面元素,查看其当前的CSS类或属性。以2024年网站版本为例,可通过CSS选择器或XPATH完成定位。

2. 适配代码(含显式等待)

使用显式等待确保元素加载完成,同时采用正确的多类名定位方式:

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

# 初始化Chrome驱动(Firefox驱动替换为webdriver.Firefox()即可)
driver = webdriver.Chrome()
driver.get("https://inventwithpython.com")

try:
    # 最长等待10秒,直到目标元素出现
    # CSS选择器:用.class1.class2表示同时拥有两个类的元素
    target_element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, ".card-img-top.cover-thumb"))
    )
    
    # 验证定位结果
    print("定位成功,元素类名:", target_element.get_attribute("class"))
    
    # 可添加后续操作,比如点击、提取链接等
    # target_element.click()
finally:
    # 关闭浏览器
    driver.quit()

3. 备选方案(类名完全变更时用)

如果网站彻底修改了类名,可通过元素的alt属性(书籍封面图片的alt通常包含书名)定位:

# 用XPATH通过alt属性和部分类名定位
target_element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//img[contains(@alt, 'Python') and contains(@class, 'cover-thumb')]"))
)

关键注意事项

  • 必须使用显式等待:动态页面中元素加载需要时间,直接调用find_element大概率抛出NoSuchElementException。
  • 多类名定位规则:
    • CSS选择器:用.class1.class2(无空格)匹配同时拥有两个类的元素;
    • XPATH:用contains(@class, 'class1') and contains(@class, 'class2'),避免因类名顺序变化导致定位失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:22:38