使用Python Selenium提取网页总页数返回0 of 0的问题求解
问题排查与修复方案
存在的问题
- 代码存在变量名笔误:你将定位到的分页元素赋值给了
totpage变量,但后续打印时调用的是page.text,若未提前定义page变量会直接报错,若实际运行时写的是totpage.text,则是下述两个原因导致返回错误值。 - 元素获取时机过早:你使用的是Angular Material框架的分页组件,初始化时默认渲染值为
0 of 0,待页面列表接口请求完成后才会更新为真实分页数据,你在接口返回前就提取了元素文本,拿到的是初始默认值。 - XPath定位错误:若XPath路径匹配到了页面中隐藏的备用分页组件、旧版本分页元素,也会返回错误的
0 of 0结果。
修复代码示例
先导入依赖:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import math
核心逻辑:
# 显式等待10秒,直到分页元素渲染出真实数据 wait = WebDriverWait(driver, 10) page_label_ele = wait.until( lambda d: d.find_element(By.CLASS_NAME, "mat-paginator-range-range-label").text.strip() not in ["", "0 of 0"] ) # 提取文本并计算总页数 label_text = page_label_ele.text.strip() per_page = int(label_text.split(" ")[2].strip()) total_count = int(label_text.split(" ")[-1].strip()) # 向上取整避免除不尽丢失最后一页 total_page = math.ceil(total_count / per_page) print(f"总页数:{total_page}")
替代方案
- 方案1:直接读取组件属性,比解析文本更稳定
Angular Material的分页组件自带数据绑定属性,不需要解析文本,直接通过JS提取即可:
# 直接读取分页组件内置的总条数、每页条数属性 total_count = driver.execute_script('return document.querySelector("mat-paginator").length') per_page = driver.execute_script('return document.querySelector("mat-paginator").pageSize') total_page = math.ceil(total_count / per_page)
- 方案2:不计算总页数,直接遍历到下一页不可点击为止
如果你的核心需求是遍历全站内容,可以跳过计算总页数的步骤,直接判断下一页按钮状态,直到按钮置灰停止遍历,鲁棒性更高:
while True: # 处理当前页的数据抓取逻辑 parse_current_page() # 定位下一页按钮 next_btn = driver.find_element(By.CLASS_NAME, "mat-paginator-navigation-next") # 判断下一页是否可点击 if next_btn.get_attribute("disabled") is not None: break next_btn.click() # 等待页面刷新完成 wait.until(EC.staleness_of(next_btn))
内容的提问来源于stack exchange,提问作者Dreamcatcher_AR
相关产品推荐
相关产品推荐

