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

Python Selenium实现Chrome中匹配URL新开标签页打开及分页遍历处理

Selenium分页批量打开链接问题解决方案

错误点修正

CSS选择器报错原因

你写的driver.find_element_by_css_selector("a[href*='respond']]")存在冗余右括号,正确写法为driver.find_element_by_css_selector("a[href*='respond']"),若需要匹配多个元素请使用复数方法find_elements_by_css_selector。

原代码窗口切换逻辑错误

原代码关闭第一个新标签后调用driver.switch_to.window(driver.window_handles[1])会触发索引越界,此时仅剩余主页面一个标签页,需要通过句柄对比定位新标签页避免报错。

分页循环实现思路

  • 外层增加无限循环,每次循环处理当前页所有目标链接
  • 处理完当前页链接后,检测「NextPage」按钮是否可点击
  • 按钮存在则点击跳转,等待页面加载后进入下一轮循环
  • 按钮不存在则跳出循环,结束任务

完整修正代码

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

# 初始化浏览器
driver = webdriver.Chrome(executable_path="C:\\Users\\xxx\\Downloads\\chromedriver_win32\\chromedriver.exe")
driver.maximize_window()
wait = WebDriverWait(driver, 10) # 配置显式等待,最长等待10秒

# 打开初始页面
driver.get("https://xxxxxxxx.com")

while True:
    # 等待当前页目标元素加载完成
    wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'h2.post-title.entry-title>a')))
    main_handle = driver.current_window_handle
    elements = driver.find_elements_by_css_selector('h2.post-title.entry-title>a')
    
    # 遍历处理当前页所有链接
    for ele in elements:
        target_url = ele.get_attribute("href")
        # 新开标签页访问目标链接
        driver.execute_script(f"window.open('{target_url}');")
        # 定位新打开的标签页
        new_handle = [h for h in driver.window_handles if h != main_handle][0]
        driver.switch_to.window(new_handle)
        
        # 等待页面元素加载完成
        wait.until(EC.presence_of_element_located((By.XPATH, "//span[@class='mb-text'][contains(.,'Posts')]")))
        time.sleep(2)
        # 写入URL到本地文件
        actualurl = driver.current_url
        with open(r'c:\test\new.txt', 'a', encoding='utf-8') as text_file:
            text_file.write(actualurl + '\n')
        
        # 关闭当前标签页,切回主页面
        driver.close()
        driver.switch_to.window(main_handle)
        time.sleep(2)
    
    # 检测是否存在下一页按钮
    try:
        next_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(),'NextPage')]")))
        next_btn.click()
        # 等待下一页加载完成
        time.sleep(3)
    except:
        # 没有下一页,跳出循环
        break

driver.quit()

优化说明

  • 用显式等待替换大部分强制sleep,提升运行稳定性,避免元素未加载导致的报错
  • 优化窗口切换逻辑,通过句柄对比定位新标签页,避免索引越界
  • 新增文件写入编码配置,避免中文乱码
  • 自动处理分页逻辑,直到没有下一页为止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:00:01