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

求助:使用BeautifulSoup定位元素返回None(元素实际存在)

问题:BeautifulSoup定位网页元素返回None,实际元素存在

我尝试用BeautifulSoup定位网页元素,但明明元素存在,返回结果却一直是None。试过用Xpath、获取父div等方法,结果都一样,不知道该怎么办了。

目标链接:https://wuzzuf.net/jobs/p/umErRniA2Sld-Senior-Full-Stack-Python-Developer-Luftborn-Cairo-Egypt?o=1&l=sp&t=sj&a=python|search-v3|navbl

我的代码

result = requests.get(link)
src = result.content
soup = BeautifulSoup(src,"lxml")
par_salary = (soup.find('span',{'class':'css-4xky9y'}))
print(par_salary.text)

报错信息

Traceback (most recent call last):
File "f:\Work\pro1\pro1.py", line 40, in
print(par_salary.text)
AttributeError: 'NoneType' object has no attribute 'text'


解决办法

1. 处理动态加载内容

很多网站用JavaScript动态渲染页面,requests只能获取初始HTML,拿不到JS加载后的内容。这种情况用selenium模拟浏览器加载:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

# 初始化浏览器(需提前安装对应浏览器驱动,比如ChromeDriver)
driver = webdriver.Chrome()
driver.get(link)

# 等待目标元素加载完成,超时时间10秒
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'css-4xky9y')))

# 获取渲染后的页面源码
src = driver.page_source
soup = BeautifulSoup(src, 'lxml')
par_salary = soup.find('span', {'class': 'css-4xky9y'})

if par_salary:
    print(par_salary.text)
else:
    print("未找到目标元素")

driver.quit()

2. 添加请求头绕过反爬

网站可能识别出爬虫身份,返回不完整内容。添加浏览器请求头模拟正常访问:

import requests
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(link, headers=headers)
src = result.content
soup = BeautifulSoup(src,"lxml")
par_salary = soup.find('span',{'class':'css-4xky9y'})

# 先判断元素是否存在,避免报错
if par_salary:
    print(par_salary.text)
else:
    print("未找到目标元素")

3. 更换定位方式(应对动态类名)

如果网站的CSS类名是动态生成的,不要硬编码类名,改用元素的文本、父容器特征定位:

from bs4 import BeautifulSoup

# 先找到包含薪资关键词的父容器
salary_section = soup.find('div', text=lambda t: t and ('Salary' in t or 'EGP' in t))
if salary_section:
    # 从父容器里找对应的span元素
    par_salary = salary_section.find('span')
    print(par_salary.text)
else:
    print("未找到薪资相关元素")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:15:34