本文详解 Selenium 爬虫中因分页元素文本为空或非数字导致 ValueError: invalid literal for int() 的根本原因,并提供健壮、可复用的页码解析方案,避免程序崩溃。
本文详解 selenium 爬虫中因分页元素文本为空或非数字导致 `valueerror: invalid literal for int()` 的根本原因,并提供健壮、可复用的页码解析方案,避免程序崩溃。
在使用 Selenium 进行分页爬取时,一个常见却易被忽视的问题是:分页导航栏(如 )中的
。正如调试输出所示,这些
- 文本为 "Go back a page" 的上一页按钮()
- 纯空字符串 ''(例如省略号 ... 或禁用按钮的 )
- 实际页码(如 "1", "2", "5")
- 甚至隐藏文本(如 bc-pub-offscreen 类标记的辅助描述)
直接使用 int(pages[-2].text) 是高风险操作——一旦目标元素 .text 为空字符串 '' 或非数字文本(如 "..."),Python 就会抛出 ValueError: invalid literal for int() with base 10,导致整个爬虫中断。
✅ 正确做法:过滤 + 安全转换
应遍历所有分页
# 定位分页容器(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 →),末尾元素可能是“下一页”按钮或空 ,索引不稳定。而 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 <p>通过上述方法,您将彻底规避 int('') 类型错误,构建出稳定、可维护的分页爬虫逻辑。记住:<strong>网页结构不可信,数据清洗必须前置</strong>——这是 Selenium 自动化采集的核心工程原则。</p>










