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

如何用Selenium点击Sky News网站的「全部接受Cookie」按钮?

问题描述

我想要为新闻网站news.sky.com编写一个抓取新闻标题的网络爬虫,但该网站经常弹出「全部接受Cookie」的提示框。我参考同类问题的指南使用XPath定位按钮,但触发了以下异常:

raise TimeoutException(message, screen, stacktrace)

看起来Selenium无法通过XPath找到该元素,请问能不能实现点击「全部接受」按钮?求帮忙解决,谢谢。

我的代码如下:

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


e_driver_path = r"F:/Download/Portable Test/msedgedriver.exe"


# establish the web driver
s = Service(e_driver_path)
driver = webdriver.Edge(service=s)


driver.get("https://news.sky.com/uk")

# search = driver.find_element_by_id(ContentPlaceHolder1_NotifyBtn)

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='notice']/div[3]/button[1]"))).click()

print("yes")
解决方案

Cookie提示框找不到通常是两个原因:元素在iframe里或者XPath定位器失效,针对sky news的情况,给你几个可行的修复方案:

方案1:检查并切换到iframe(如果存在)

部分网站会把Cookie弹窗放在独立的iframe中,Selenium默认无法直接定位到iframe内的元素,必须先切换上下文:

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

e_driver_path = r"F:/Download/Portable Test/msedgedriver.exe"
s = Service(e_driver_path)
driver = webdriver.Edge(service=s)
driver.get("https://news.sky.com/uk")

try:
    # 等待iframe加载并切换
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[title*='cookie']"))
    )
    driver.switch_to.frame(iframe)
    
    # 点击全部接受按钮
    accept_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-testid='cookie-accept-all']"))
    )
    accept_btn.click()
    
    # 切回主文档
    driver.switch_to.default_content()
    print("Cookie弹窗已处理")
except:
    # 没有iframe或者按钮不存在时跳过
    print("未检测到Cookie弹窗")

方案2:用更稳定的CSS选择器替代XPath

sky news的Cookie按钮有明确的测试ID或文本标识,CSS选择器比XPath更不容易失效:

# 替换原代码中的等待点击部分
try:
    # 针对中文界面
    accept_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, "//button[contains(text(),'全部接受')]"))
    )
    accept_btn.click()
except:
    # 备用:针对英文界面的按钮
    accept_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-testid='cookie-accept-all']"))
    )
    accept_btn.click()

方案3:直接通过浏览器配置跳过Cookie弹窗

如果用Edge浏览器,可以在启动时加参数自动接受所有Cookie,彻底避免弹窗:

from selenium.webdriver.edge.options import Options

edge_options = Options()
# 添加自动接受Cookie的配置
edge_options.add_argument("--disable-popup-blocking")
edge_options.add_experimental_option("prefs", {
    "profile.default_content_setting_values.cookies": 1,
    "profile.cookie_controls_mode": 0  # 0代表允许所有Cookie
})

# 初始化driver时传入配置
s = Service(e_driver_path)
driver = webdriver.Edge(service=s, options=edge_options)
driver.get("https://news.sky.com/uk")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:05:33