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

使用Selenium爬取动态页面时遭遇InvalidSelectorException问题求助

问题解决思路

错误原因分析

  • 你用By.CLASS_NAME时传的[name="card cardtools zoom card-group"]是CSS选择器语法,完全不符合CLASS_NAME的使用规则——CLASS_NAME只能传单个类名,多类匹配得用CSS_SELECTOR或XPATH。
  • 注释里的driver.find_elements(By.XPATH('//*...'))语法错误,正确写法是driver.find_elements(By.XPATH, '//*...'),By.XPATH是枚举值,不是可调用的函数。
  • 这个错误和授权无关,纯粹是选择器语法写错了。

修正后的代码示例

from selenium import webdriver 
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = "https://cnft.tools/claynation"

s = Service(r"C:\Users\marti\Downloads\chromedriver_win32\chromedriver.exe")
driver = webdriver.Chrome(service=s) 
driver.get(url)

# 等待动态元素加载,避免直接查找失败
wait = WebDriverWait(driver, 10)
# 用CSS_SELECTOR匹配带多个类的卡片元素
pieces = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.card.cardtools.zoom.card-group')))

for piece in pieces:
    # 用相对XPATH获取排名和价格,避免绝对路径因页面结构变化失效
    rank = piece.find_element(By.XPATH, './/div[contains(@class, "rank")]/span/div').text
    price = piece.find_element(By.XPATH, './/div[contains(@class, "price")]/div/div').text
    print(f"排名: {rank}, 价格: {price}")

driver.quit()

关键修正点

  • 替换错误选择器:用By.CSS_SELECTOR匹配多类元素,语法为div.card.cardtools.zoom.card-group(类名用点分隔)。
  • 添加显式等待:通过WebDriverWait等待元素加载,解决动态渲染导致的元素找不到问题。
  • 使用相对XPATH:放弃脆弱的绝对路径,改用包含类名的相对路径,适配页面结构的小变动。
  • 修正find_elements语法:By.XPATH作为第一个参数,选择器字符串作为第二个参数。

额外注意事项

  • 只有后续遇到登录弹窗、权限提示时,才需要考虑授权问题,当前错误和授权无关。
  • 确保ChromeDriver版本和你的Chrome浏览器(104.0.5112.102)完全匹配,版本不兼容也会导致各种异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:39:19