使用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
相关产品推荐
相关产品推荐

