
本文详解如何解决 Selenium 爬虫中因分页元素包含非数字文本(如“Go back a page”、省略号“…”或空字符串)导致 int() 转换失败的 ValueError,并提供健壮、可复用的页码解析方案。
本文详解如何解决 selenium 爬虫中因分页元素包含非数字文本(如“go back a page”、省略号“…”或空字符串)导致 `int()` 转换失败的 valueerror,并提供健壮、可复用的页码解析方案。
在使用 Selenium 进行分页爬取时,一个常见陷阱是:直接假设分页导航栏中某个索引位置(如 pages[-2])一定包含有效数字。但正如调试输出所示,Audible 等网站的分页 HTML 结构往往混合了多种 <li> 元素——包括上一页/下一页按钮、当前页高亮标签、省略号 ... 以及纯数字链接。这些元素的 .text 属性可能为 'Go back a page'、'...'、空字符串 '' 或不可见字符,一旦传入 int() 就会抛出 ValueError: invalid literal for int() with base 10。
根本原因在于:pages = pagination.find_elements(By.TAG_NAME, 'li') 返回的是所有分页项(含按钮、分隔符),而非仅数字页码。盲目取索引(如 pages[-2].text)极易命中非数字节点。
✅ 正确做法是:过滤 + 安全转换。遍历所有分页项,仅保留 .text.strip() 后可成功转为整数的值,再取最大值作为总页数:
# 安全提取最大页码(推荐)
pages = WebDriverWait(pagination, 20).until(
EC.presence_of_all_elements_located((By.TAG_NAME, "li"))
)
page_numbers = []
for page in pages:
text = page.text.strip()
if text.isdigit(): # 只处理纯数字字符串(如 "1", "5")
page_numbers.append(int(text))
if not page_numbers:
raise RuntimeError("未能从分页栏提取到任何有效页码")
last_page = max(page_numbers) # 取最大值,即末页页码
print(f"检测到总页数: {last_page}")? 进阶优化建议:
- 避免依赖固定索引:不要硬编码 pages[-2] 或 pages[1],页面结构微调即失效;
- 增强容错性:使用 text.isdigit() 比 try/except 更轻量;若需支持带前导/后缀的数字(如 "Page 5"),可用正则 re.search(r'\b(\d+)\b', text) 提取;
- 验证逻辑合理性:确保 last_page >= 1,并检查是否与实际 URL 中的 page= 参数一致;
- 配合显式等待:对 pagination 和 pages 使用 WebDriverWait,避免因 DOM 渲染延迟导致空列表。
⚠️ 注意事项:
- page.text 可能包含不可见空格或换行符,务必调用 .strip();
- ...(省略号)通常渲染为空文本 '',''.isdigit() 返回 False,自然被过滤;
- 若网站采用动态加载(如点击“下一页”才渲染后续页码),需在每轮翻页后重新定位 pagination 元素,否则 pages 列表将过期。
最终,将此逻辑嵌入你的爬虫主循环即可稳定获取总页数,彻底规避 ValueError。稳健的页码解析,是构建可靠分页爬虫的第一道防线。

















