使用Selenium如何正确计算分页组件的总页数?(现有代码返回0)
Selenium统计分页总页数结果为0问题
需求说明
- 统计目标页面分页组件的总页数,例:实际总页数为6时,统计得到的长度值应为6
- 参考分页组件截图可见,组件存在5页以上的页码条目
- 初始实现逻辑无法正确获取页数,最终返回的长度统计值为0
分页组件截图
分页组件实际HTML结构
<div class="col-md-12"> <ul class="pagination"> <li id="MainCopy_ctl19_Pager_liPrev" class="disabled"> <a id="MainCopy_ctl19_Pager_PreviousPageButton" title="«" class="aspNetDisabled">«</a> </li> <li> </li> <li id="MainCopy_ctl19_Pager_Repeater1_pager_li_0" class="active"> <a id="MainCopy_ctl19_Pager_Repeater1_PageLink_0" class="aspNetDisabled">1 </a> </li> <li id="MainCopy_ctl19_Pager_Repeater1_pager_li_1"> <a id="MainCopy_ctl19_Pager_Repeater1_PageLink_1" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainCopy$ctl19$Pager$Repeater1$ctl01$PageLink", "", true, "", "", false, true))">2 </a> </li> <li id="MainCopy_ctl19_Pager_Repeater1_pager_li_2"> <a id="MainCopy_ctl19_Pager_Repeater1_PageLink_2" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainCopy$ctl19$Pager$Repeater1$ctl02$PageLink", "", true, "", "", false, true))">3 </a> </li> <li id="MainCopy_ctl19_Pager_Repeater1_pager_li_3"> <a id="MainCopy_ctl19_Pager_Repeater1_PageLink_3" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainCopy$ctl19$Pager$Repeater1$ctl03$PageLink", "", true, "", "", false, true))">4 </a> </li> <li id="MainCopy_ctl19_Pager_Repeater1_pager_li_4"> <a id="MainCopy_ctl19_Pager_Repeater1_PageLink_4" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainCopy$ctl19$Pager$Repeater1$ctl04$PageLink", "", true, "", "", false, true))">5 </a> </li> <li> <a id="MainCopy_ctl19_Pager_NextSectionButton" title="..." href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainCopy$ctl19$Pager$NextSectionButton", "", true, "", "", false, true))">...</a> </li> <li id="MainCopy_ctl19_Pager_liNext"> <a id="MainCopy_ctl19_Pager_NextPageButton" title="»" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainCopy$ctl19$Pager$NextPageButton", "", true, "", "", false, true))">»</a> </li> </ul> </div>
原有错误实现代码
paginat = len(browser.find_elements_by_xpath('//ul[@class="pagination"]/div/ul')) print(paginat) for page1 in range(0,paginat): #print(len(pagination)) print(page1)
错误原因
- 路径匹配逻辑完全错位:带
pagination类的ul本身是分页组件的最外层容器,它的所有直接子节点都是li标签,不存在嵌套的div、内层ul结构,因此原XPath匹配不到任何元素,最终统计长度为0。 - 统计思路本身存在缺陷:就算XPath路径修正为匹配ul下的所有li元素,也无法拿到真实总页数。该分页组件采用分段渲染逻辑,非当前可见区间的页码节点不会插入DOM,初始页面仅渲染当前可见的1-5页节点,后续6-10页的节点只有点击分段切换按钮后才会加载,仅统计初始DOM的节点数量会得到远小于真实值的结果。
修正实现方案
- 定位规则优化:基于DOM中数字页码元素的固定id特征筛选有效节点,排除上一页箭头、下一页箭头、省略号按钮、空占位li等非页码元素
- 数值转换逻辑:将筛选到的页码元素文本提取、转为整数后取最大值,即为当前页面可见范围的最高页码
- 全量总页数获取:由于分页为分段显示机制,需要循环点击下一页按钮,直到下一页按钮变为不可点击的disabled状态,此时页面显示的最大页码即为真实总页数
修正后的基础代码示例:
# 筛选所有带固定id前缀的数字页码元素 page_link_elements = browser.find_elements( "xpath", '//ul[@class="pagination"]//a[starts-with(@id, "MainCopy_ctl19_Pager_Repeater1_PageLink_")]' ) # 提取页码文本转为整数列表 page_values = [int(elem.text.strip()) for elem in page_link_elements] # 获取当前可见的最高页码 visible_max_page = max(page_values) print(visible_max_page)
内容的提问来源于stack exchange,提问作者abhisekh
相关产品推荐
相关产品推荐

