使用BeautifulSoup查找指定class元素返回None或空列表问题求助
问题原因分析
- 缺少请求头伪装:直接用
requests.get()默认的UA标识会被目标站点识别为爬虫,返回的页面内容缺失对应元素或者直接返回拦截页,所以find查询返回None - 链接未拼接域名:从列表页抓取的
href属性是相对路径(格式为/jobs/p/xxx),直接请求相对路径会报404,无法拿到正确的岗位详情页内容 - 未做空值兼容:不是所有岗位都会公开薪资信息,就算页面正常加载,也可能不存在对应类名的span标签,需要提前做异常兼容
- 取值逻辑遗漏:原代码直接把soup找到的tag对象存入列表,没有取
text属性,就算拿到元素也会是标签对象而非薪资文本
修正后的可运行代码
import requests from bs4 import BeautifulSoup # 全局配置 BASE_URL = "https://wuzzuf.net" HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } list_jobs = [] links = [] list_companies = [] list_locations = [] list_skills = [] list_salaries = [] # 列表页抓取逻辑保持不变,仅修改链接拼接部分 for i in range(len(job_titles)): list_jobs.append(job_titles[i].text) # 拼接相对路径为完整可访问链接 raw_link = job_titles[i].find("a").attrs["href"] full_link = BASE_URL + raw_link if raw_link.startswith("/") else raw_link links.append(full_link) list_companies.append(company_names[i].text) list_locations.append(locations[i].text) list_skills.append(job_skills[i].text) for link in links: # 请求添加伪装头 result = requests.get(link, headers=HEADERS) # 校验请求状态,异常直接跳过 if result.status_code != 200: list_salaries.append("页面获取失败") continue src = result.content soup = BeautifulSoup(src, "lxml") salaries_tag = soup.find('span' , {'class' : 'css-4xky9y'}) # 空值兼容处理 if salaries_tag: salaries = salaries_tag.text.strip() list_salaries.append(salaries) print(salaries) else: list_salaries.append("薪资未公开") print("薪资未公开")
补充说明
- 如果添加UA后还是拿不到元素,可以打印
result.text搜索类名css-4xky9y是否存在,确认是反爬拦截还是元素类名发生了变更 - 如果站点内容是JS动态渲染的,普通requests请求拿不到渲染后的内容,可以替换为selenium模拟浏览器加载页面后再解析
内容的提问来源于stack exchange,提问作者S.m
相关产品推荐
相关产品推荐

