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

使用Selenium遍历无下一页按钮的表格分页方案咨询

分页爬取实现方案

原有代码核心问题

  • XPath语法错误,格式化字符串没有预留{}占位符,无法匹配到对应页码元素
  • 直接指定页码点击的方案,遇到分页出现省略号的场景会直接失效
  • 没有等待页面跳转/元素加载完成就执行操作,容易触发无意义报错

实现逻辑

不用预先获取总页码,依靠当前页的active类标记判断分页进度:

  1. 每次先爬取当前页的表格数据
  2. 定位带有active类的当前页码元素
  3. 查找该元素的下一个同级<li>节点,如果该节点存在可点击的<a>标签,就点击进入下一页
  4. 如果找不到下一个可点击的分页节点,说明已经到最后一页,终止循环

完整修改后代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as bs
import pandas as pd
import time

path_driver = "C:/Users/CS330584/Documents/Documentos de Defesa da Concorrência/Automatização de Processos/chromedriver.exe"
website = "https://sat.sef.sc.gov.br/tax.NET/Sat.Dva.Web/ConsultaPublicaDevedores.aspx"
value_search = "300"
# 存储所有爬取的数据
all_data = []

driver = webdriver.Chrome(path_driver)
driver.get(website)
# 显式等待设置,最长等10秒
wait = WebDriverWait(driver, 10)

# 输入查询条件并搜索
search_max = wait.until(EC.presence_of_element_located((By.ID, "Body_Main_Main_ctl00_txtTotalDevedores")))
search_max.send_keys(value_search)

btn_consult = wait.until(EC.element_to_be_clickable((By.ID, "Body_Main_Main_ctl00_btnBuscar")))
btn_consult.click()

while True:
    # 等待当前页表格加载完成
    wait.until(EC.presence_of_element_located((By.ID, "Body_Main_Main_grpDevedores_gridView")))
    # 解析当前页表格
    soup = bs(driver.page_source, 'lxml')
    table = soup.find('table', id='Body_Main_Main_grpDevedores_gridView')
    # 提取表格行数据,跳过表头和分页行
    rows = table.find_all('tr')[1:-1]
    for row in rows:
        cols = [col.get_text(strip=True) for col in row.find_all('td')]
        if cols:
            all_data.append(cols)
    
    # 尝试找下一页
    try:
        # 定位当前激活的页码
        active_page = driver.find_element(By.CSS_SELECTOR, '#Body_Main_Main_grpDevedores_gridView li.active')
        # 找下一个分页li节点
        next_page_li = active_page.find_element(By.XPATH, './following-sibling::li[1]')
        # 判断下一个节点是否有可点击的a标签(排除禁用的分页节点)
        next_page_a = next_page_li.find_element(By.TAG_NAME, 'a')
        # 点击下一页
        next_page_a.click()
        # 等待页面跳转,新的页码激活
        wait.until(EC.staleness_of(active_page))
        time.sleep(0.5)
    except:
        # 找不到下一页节点,终止循环
        break

# 导出数据到csv
df = pd.DataFrame(all_data)
df.to_csv('devedores.csv', index=False, encoding='utf-8-sig')
driver.quit()

注意事项

  • 如果你使用的是selenium 4.6+版本,不需要手动指定chromedriver路径,Selenium会自动匹配对应版本的驱动
  • 可以根据你的网络情况调整显式等待的时长,避免加载慢导致报错
  • 爬取过程中不要手动操作浏览器窗口,避免元素定位失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:08