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

Selenium Python 带分页动态表格爬取元素查找失败问题

解决Selenium动态表格分页遍历问题

问题分析

你当前的代码通过绝对XPATH按索引定位分页的<li>元素,当页码超过前5页后,页面会用省略号(…)替代后续未显示的页码,此时目标页码的<li>元素并未渲染在HTML中,自然无法通过固定索引找到,导致元素查找失败。

可行解决方案

方案1:循环点击「下一页」按钮(最稳定)

如果分页控件存在「下一页」按钮(通常是类似“>”或“下一页”的元素),直接循环点击该按钮直到按钮变为不可点击状态,无需关心具体页码:

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

# 提取当前页表格数据的逻辑,自行补充
def get_table_data():
    pass

# 循环遍历所有页
while True:
    try:
        # 先抓取当前页数据
        get_table_data()
        
        # 等待下一页按钮可点击,替换成你实际的下一页按钮定位器
        next_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, 'li.paginate_button.next:not(.disabled) a'))
        )
        next_btn.click()
        time.sleep(2)  # 可根据页面加载速度调整,或替换为显式等待
    except:
        # 下一页按钮不可点击,说明已到最后一页,抓取最后一页数据后退出
        get_table_data()
        break

方案2:处理省略号,显示隐藏页码

如果必须定位具体页码,可以先点击省略号让隐藏的页码显示出来,再定位目标页码:

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

total_pages = 20  # 已知总页数
# 提取当前页表格数据的逻辑,自行补充
def get_table_data():
    pass

for page in range(2, total_pages + 1):
    try:
        # 尝试直接定位目标页码的按钮
        page_btn = driver.find_element(By.XPATH, f'//ul[contains(@class,"pagination")]//a[text()="{page}"]')
        page_btn.click()
    except:
        # 找不到目标页码,点击省略号显示更多页码
        ellipsis_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.ID, 'vehicle-compatibility-table_ellipsis'))
        )
        ellipsis_btn.click()
        # 再次尝试定位目标页码
        page_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, f'//ul[contains(@class,"pagination")]//a[text()="{page}"]'))
        )
        page_btn.click()
    # 等待页面加载并抓取数据
    time.sleep(2)
    get_table_data()

方案3:直接调用接口获取数据(效率最高)

很多动态表格(比如DataTables)是通过AJAX请求加载数据的,你可以抓包找到数据接口,直接用requests库请求接口获取所有页面数据,无需操作浏览器:

import requests

# 替换成实际的API接口地址,参数从抓包结果中获取
api_url = "https://example.com/api/vehicle-compatibility-data"
total_pages = 20

all_data = []
for page in range(1, total_pages + 1):
    params = {
        'page': page,
        'length': 10,  # 每页条数,从抓包结果中获取
        'search[value]': ''  # 搜索参数,无搜索则为空
        # 其他必要参数,按抓包结果补充
    }
    response = requests.get(api_url, params=params)
    data = response.json()
    all_data.extend(data['data'])  # 根据接口返回的结构调整字段

# 处理获取到的所有数据
print(all_data)

原代码问题说明

你使用的绝对XPATH是通过元素在DOM中的层级索引定位的,当分页结构变化(比如出现省略号),索引对应的元素就不再是目标页码,导致查找失败。建议改用基于文本的定位(比如找显示页码数字的<a>元素)或基于控件功能的定位(如下一页按钮),提升代码稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:33:17