《Python编程快速上手》Selenium网页抓取代码失效,求2023适配方案
解决方案:适配当前网站的Selenium元素定位代码
问题根源
- 多类名定位逻辑错误:
By.CLASS_NAME不支持同时指定多个类名(无论用空格还是点分隔都无效),这是你之前尝试失败的核心原因之一。 - 网站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'),避免因类名顺序变化导致定位失效。
- CSS选择器:用
内容的提问来源于stack exchange,提问作者Schlossie
相关产品推荐
相关产品推荐

