新闻文章爬取问题: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
相关产品推荐
相关产品推荐

