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

BeautifulSoup查找指定class的span返回None,求非Selenium解决方案

问题原因分析
  • 类名不稳定:你定位用的css-4xky9y属于前端CSS-in-JS方案生成的哈希类名,只有浏览器执行完前端JS后才会渲染为该类名,直接用requests请求拿到的初始静态HTML中,对应元素的类名和你在浏览器F12控制台看到的不一致,所以定位失败。
  • 元素动态加载:薪资内容本身是页面加载完成后,JS异步调用后端接口获取数据后才插入到DOM中的,初始静态HTML里不存在该元素,自然无法定位到。
  • 反爬拦截:请求没有带足够的身份标识(比如User-Agent、Cookie等),网站返回的是异常页面而非正常的薪资详情页,所以不存在目标元素。
  • 定位规则错误:部分场景下前端类名会有多个值,你用精确匹配单个类名的方式也可能匹配失败。
不使用Selenium的解决方案

首先先执行排查步骤:打印print(result.text),在输出内容中搜索目标薪资数值和你要用的类名,确认是否存在于requests返回的静态源码中,再对应选择方案:

方案1:更换稳定的定位规则,放弃哈希类名

不要依赖动态生成的哈希类名,用文本关联定位:

# 先找到包含Salary文本的标签
salary_label = soup.find("span", string=lambda t: t and "Salary" in t.strip())
# 再找后续相邻的span节点提取值
if salary_label:
    salary_val = salary_label.find_next("span").text.strip()
    salary.append(salary_val)

方案2:正则直接匹配薪资内容

如果薪资格式固定,直接从响应文本中用正则提取,完全不依赖DOM结构:

import re
# 按你的薪资格式写匹配规则
pattern = r'\d+\s+to\s+\d+\s+EGP\s+Per\s+Month'
match_res = re.search(pattern, result.text)
if match_res:
    salary_val = match_res.group()
    salary.append(salary_val)

方案3:抓接口直接拿数据

打开浏览器控制台的「网络」面板,筛选XHR/fetch请求,刷新页面后找到返回薪资数据的后端接口,直接请求该接口拿JSON格式数据,解析效率更高且更稳定。

方案4:补充请求头绕过基础反爬

如果是反爬导致返回异常页面,补充模拟浏览器的请求头即可:

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",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Referer": "你请求页面的上级页面地址"
}
result = requests.get(link, headers=headers)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:18:03