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

新闻文章爬取问题:XPath日期异常与元素点击拦截错误

解决元素点击拦截与日期提取问题

一、处理aswift_7 iframe导致的点击拦截错误

这个问题是广告iframe挡住了目标元素,试试下面几种解决办法:

1. 用JavaScript直接触发点击

绕过页面遮挡,直接调用元素的点击事件,替换原代码里的elem.click():

driver.execute_script("arguments[0].click();", elem)

2. 隐藏遮挡的广告iframe

把广告iframe直接隐藏,再正常点击元素:

# 定位广告iframe并隐藏
ad_iframe = driver.find_element(By.ID, "aswift_7")
driver.execute_script("arguments[0].style.display = 'none';", ad_iframe)
# 再点击目标元素
elem.click()

3. 滚动到元素可见位置再点击

如果元素不在当前视口,先滚动过去再点击:

driver.execute_script("arguments[0].scrollIntoView(true);", elem)
time.sleep(0.5) # 给页面一点滚动缓冲时间
elem.click()

二、修复日期输出问题(已验证XPath正确但无效)

即使XPath没问题,也可能是页面加载时机或上下文问题,试试这些调整:

1. 强制等待日期元素加载完成

别用time.sleep(),改用显式等待确保元素已渲染:

# 替换成你的日期元素XPath
date_element = WebDriverWait(driver, 20).until(
    EC.visibility_of_element_located((By.XPATH, "//section[@class='col-md-8 content']/p[@class='date']"))
)
date_text = date_element.text

2. 检查是否切换到了新标签页

点击文章链接后可能打开了新窗口,必须切换到新窗口才能提取内容:

# 点击后等待新窗口出现并切换
original_window = driver.current_window_handle
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
for window_handle in driver.window_handles:
    if window_handle != original_window:
        driver.switch_to.window(window_handle)
        break
# 此时在新窗口里提取标题和日期

3. 确认元素不在嵌套iframe中

如果日期元素在某个iframe里,需要先切换到对应iframe再定位:

# 替换成日期所在的iframe定位方式
driver.switch_to.frame("iframe_id_or_name")
# 然后提取日期
date_element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "你的日期XPath")))
# 提取完切回主文档
driver.switch_to.default_content()

完整修改后的代码示例

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

# 遍历打开文章
for i in range(13, noOfArticles + 1):
    try:
        # 等待目标链接可点击
        elem = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, f"//section[@class='col-md-8 content']/a[{i}]")))
        if elem.is_displayed():
            # 用JS点击绕过广告遮挡
            driver.execute_script("arguments[0].click();", elem)
            
            # 切换到新打开的文章标签页
            original_window = driver.current_window_handle
            WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
            for window_handle in driver.window_handles:
                if window_handle != original_window:
                    driver.switch_to.window(window_handle)
                    break
            
            # 提取标题和日期
            headline = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//section[@class='col-md-8 content']/h1"))).text
            # 替换成你的日期元素XPath
            date_text = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//section[@class='col-md-8 content']/p[@class='date']"))).text
            
            print(f"标题: {headline}")
            print(f"日期: {date_text}")
            
            # 关闭当前文章标签页,切回原页面继续遍历
            driver.close()
            driver.switch_to.window(original_window)
    except Exception as e:
        print("出错了:", e)
        # 异常时如果开了新窗口,切回原页面
        if len(driver.window_handles) > 1:
            driver.close()
            driver.switch_to.window(original_window)

内容的提问来源于stack exchange,提问作者Mohita Trehan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:28:21