You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬虫爬取网页字符串转整数偶发ValueError问题排查

问题根因

固定位置字符串切片的写法鲁棒性极差,完全依赖返回文本的固定字符长度和排版。Indeed会根据访问IP的地区、账号语言设置、前端灰度A/B测试调整统计文案的措辞和长度,一旦文案格式变化,预设的切片偏移量就会错位,把非数字的文本内容切出来,转整数时必然抛出ValueError。你报错里提到的切取结果s | Page 1 of 就是典型的切片偏移不匹配问题。

修复方法

放弃硬编码位置切片的逻辑,改用正则表达式定向提取文本中的职位总数,适配不同格式的文案:

  • 新增正则模块依赖,匹配文案中符合“千分位格式数字+jobs”规则的片段,精准定位总职位数
  • 增加元素非空判断、匹配结果非空判断作为兜底,避免页面结构变动、反爬拦截时程序直接崩溃

修复后的可运行代码:

import requests
import re
from bs4 import BeautifulSoup

# 建议补充真实请求头降低反爬拦截概率
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
result = requests.get("https://www.indeed.com/jobs?q=web%20development&start=0", headers=headers)
source = result.content
soup = BeautifulSoup(source, "lxml")

count_element = soup.find("div", {"id": "searchCountPages"})
if not count_element:
    raise RuntimeError("未找到职位总数元素,可能触发了反爬验证")
job_count_text = count_element.text.strip()

# 正则匹配总职位数:匹配数字+千分位逗号组成的数字串,后接jobs关键词
count_match = re.search(r'([\d,]+)\s+jobs', job_count_text)
if not count_match:
    raise ValueError(f"未从文本中匹配到职位总数,当前文本内容:{job_count_text}")

job_posted = int(count_match.group(1).replace(",", ""))
print(job_posted)

额外提示:如果短时间内请求频率过高,即使加了请求头也可能被Indeed重定向到人机验证页面,建议控制请求间隔,搭配代理池使用提升稳定性。

内容的提问来源于stack exchange,提问作者Wisam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:36:24