本文详解 Selenium 爬虫中因分页元素文本为空或非数字导致 ValueError: invalid literal for int() 的根本原因,并提供健壮、可复用的页码解析方案,避免程序崩溃。
本文详解 selenium 爬虫中因分页元素文本为空或非数字导致 `valueerror: invalid literal for int()` 的根本原因,并提供健壮、可复用的页码解析方案,避免程序崩溃。
在使用 Selenium 进行分页爬取时,一个常见却易被忽视的问题是:分页导航栏(如 <ul class="pagingElements">)中的 <li> 元素并不都包含有效页码数字。正如调试输出所示,这些 <li> 可能包含:
- 文本为 "Go back a page" 的上一页按钮(<span class="previousButton">)
- 纯空字符串 ''(例如省略号 ... 或禁用按钮的 <span>)
- 实际页码(如 "1", "2", "5")
- 甚至隐藏文本(如 bc-pub-offscreen 类标记的辅助描述)
直接使用 int(pages[-2].text) 是高风险操作——一旦目标元素 .text 为空字符串 '' 或非数字文本(如 "..."),Python 就会抛出 ValueError: invalid literal for int() with base 10,导致整个爬虫中断。
✅ 正确做法:过滤 + 安全转换
应遍历所有分页 <li> 元素,仅提取其中可成功转为整数的文本内容,再取最大值作为总页数。以下是推荐实现:
# 定位分页容器(ul)
pagination = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.XPATH, './/ul[contains(@class, "pagingElements")]'))
)
# 获取所有分页项(li)
page_items = pagination.find_elements(By.TAG_NAME, 'li')
# 提取所有合法页码数字
page_numbers = []
for item in page_items:
text = item.text.strip()
if text.isdigit(): # 严格校验:仅含数字字符
page_numbers.append(int(text))
if not page_numbers:
raise ValueError("No valid page numbers found in pagination")
last_page = max(page_numbers) # 取最大页码,而非固定索引(如 [-2])
print(f"Detected total pages: {last_page}")? 为什么用 max() 而不是 pages[-2].text?
因为分页结构动态性强(如 1 2 ... 5 →),末尾元素可能是“下一页”按钮或空 <span>,索引不稳定。而 max(page_numbers) 始终返回真实最大页码,鲁棒性更高。
⚠️ 关键注意事项
- 勿依赖固定索引:pages[-2] 在不同页面/响应下可能指向省略号、禁用按钮或空节点,极易失效;
- .text vs .get_attribute('textContent'):.text 返回渲染后可见文本(已过滤 display:none 和 bc-pub-offscreen),更可靠;若需原始内容,可用 get_attribute('textContent').strip();
- 空页处理:添加 if not page_numbers: 校验,防止无分页时静默失败;
- 性能优化:无需 WebDriverWait 套娃等待子元素——pagination.find_elements() 已在父容器就绪后执行,更轻量;
- 兼容性增强:对含空格或前导零的文本(如 " 5 "),可改用 text.strip().isdigit() 或正则 re.match(r'^\d+$', text.strip())。
✅ 最终建议的分页循环结构(片段)
current_page = 1
while current_page <= last_page:
# ✅ 抓取当前页数据(略)
scrape_page_data(driver)
# ✅ 安全翻页:优先点击「下一页」按钮,失败则尝试 URL 拼接
try:
next_btn = driver.find_element(By.XPATH, '//span[contains(@class,"nextButton")]//a')
next_btn.click()
WebDriverWait(driver, 10).until(EC.staleness_of(next_btn)) # 等待页面刷新
current_page += 1
except Exception as e:
print(f"Failed to navigate to page {current_page + 1}: {e}")
break # 避免无限重试通过上述方法,您将彻底规避 int('') 类型错误,构建出稳定、可维护的分页爬虫逻辑。记住:网页结构不可信,数据清洗必须前置——这是 Selenium 自动化采集的核心工程原则。

















