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

使用Selenium爬取无标识符分页页面时如何实现翻页操作?

解决方案

这个站点是典型的ASP.NET WebForm架构,分页操作通过__doPostBack方法触发,就算分页元素没有唯一标识,也可以通过以下两种方式实现下一页导航:

方案1:通过相对路径+文本特征定位下一页按钮

分页区域的页码都属于同一个父容器,当前激活页一般会有特殊样式(比如加粗、用span包裹而非a标签),可以通过以下XPATH定位下一页按钮:

  • 定位到当前激活的页码元素后,取它的下一个同级a标签://td[@align='center']/span/../following-sibling::td[1]/a
  • 或者直接匹配下一页的文本标识,该站点下一页用的是>符号,定位XPATH为://a[text()='>']

方案2:直接执行JS触发分页(更稳定,无需定位元素)

不需要找按钮,直接执行站点内置的__doPostBack方法即可触发翻页,每页对应的参数规则为第一个参数'ctl00$ContentPlaceHolder1$gvDetails',第二个参数为'Page$' + 页码数。


完整的翻页实现代码(接在你现有点击查询的代码之后)

# 等待查询结果加载完成
WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.ID, "ContentPlaceHolder1_gvDetails"))
)

page_num = 1
while True:
    # ------------ 这里写你当前页的数据提取逻辑 ------------
    rows = driver.find_elements(By.XPATH, "//table[@id='ContentPlaceHolder1_gvDetails']//tr[position()>1]")
    for row in rows:
        # 跳过分页导航行
        if "Page" in row.text:
            continue
        # 提取字段逻辑可自行调整
        cols = row.find_elements(By.TAG_NAME, "td")
        if len(cols) >=5:
            yield {
                "branch_name": cols[0].text.strip(),
                "address": cols[1].text.strip(),
                "state": cols[2].text.strip(),
                "district": cols[3].text.strip(),
                "pincode": cols[4].text.strip(),
                "brand": self.brand_name
            }
    # -----------------------------------------------------

    # 检查是否存在下一页
    try:
        # 尝试定位下一页按钮,不可点击就退出循环
        next_btn = WebDriverWait(driver, 3).until(
            EC.element_to_be_clickable((By.XPATH, "//a[text()='>']"))
        )
        # 若使用方案2的JS触发翻页,可替换上面两行代码为:
        # driver.execute_script(f"__doPostBack('ctl00$ContentPlaceHolder1$gvDetails', 'Page${page_num+1}')")
        
        # 点击下一页
        next_btn.click()
        page_num +=1
        # 等待页面加载完成,判断当前页是否更新
        WebDriverWait(driver, 20).until(
            EC.text_to_be_present_in_element(
                (By.XPATH, "//td[@align='center']/span"), str(page_num)
            )
        )
    except Exception as e:
        # 没有下一页就退出循环
        break

# 操作完成关闭驱动
driver.quit()

注意事项

  • 每次翻页后要加等待逻辑,判断当前页码是否更新,避免还没加载完成就提取数据导致重复
  • 如果遇到部分城市分页数量多,可以加随机延时避免被反爬拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:09:03