使用Selenium与Python自动化Chrome爬取Transfermarkt时,处理Cookie同意弹窗出现InvalidArgumentException报错求助
嘿,我仔细看了你的代码和报错信息,很快就能定位到几个导致问题的小细节,咱们一步步来解决:
第一个问题:find_element的参数格式与定位方式不匹配
你这段处理弹窗的代码存在明显错误:
driver.switch_to.frame(driver.find_element((By.CLASS_NAME,"//div[@class='message-container.cmp-banner']")))
- 首先,
find_element的正确调用方式是find_element(by, value),你错误地把两个参数包裹成了一个元组,这直接触发了'using' must be a string的报错——Selenium期望第一个参数是By枚举的成员(比如By.CLASS_NAME),而不是一个打包的元组。 - 其次,你写了XPATH格式的字符串,却指定用
By.CLASS_NAME定位,这完全不匹配。By.CLASS_NAME只接受单个类名,而message-container.cmp-banner是两个类名的组合,如果你想用类名定位,应该选其中一个(比如message-container),或者改用By.CSS_SELECTOR写.message-container.cmp-banner。
第二个问题:不必要的iframe切换
Transfermarkt的Cookie同意弹窗并不在iframe中,所以你完全不需要执行driver.switch_to.frame(...)这一步。强行切换iframe反而会让后续找同意按钮的操作在错误的页面上下文中执行,大概率会导致找不到元素。
修正后的完整代码
我把处理Cookie弹窗的部分重新调整了,同时建议用更可靠的显式等待代替固定的time.sleep,避免因网络加载慢导致的元素找不到问题:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # Set the location of Chrome driver path = "C:/Users/jober/webscraper/chromedriver-win32/chromedriver.exe" s = Service(path) ChromeOptions = Options() ChromeOptions.headless = False # 显示浏览器窗口 # 创建WebDriver实例 driver = webdriver.Chrome(service=s, options=ChromeOptions) driver.maximize_window() # 最大化窗口 driver.implicitly_wait(30) # 访问目标网站 website = 'https://www.transfermarkt.com/' driver.get(website) # 处理Cookie弹窗:用显式等待等待按钮可点击,比固定sleep更稳定 wait = WebDriverWait(driver, 15) consent_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@aria-label='Accept & continue']"))) consent_button.click() # 保持窗口打开一段时间 time.sleep(60) # 关闭浏览器 driver.quit()
额外小提示
- 尽量减少
time.sleep的使用,显式等待会根据元素的实际状态动态等待,比固定时长等待更稳定,也不会浪费不必要的时间。 - 如果后续爬取遇到元素定位问题,可以按下F12打开浏览器开发者工具,直接查看元素的实际属性和位置,避免定位方式选错。
备注:内容来源于stack exchange,提问作者JobertGutierrez
相关产品推荐
相关产品推荐

