使用BeautifulSoup爬取Indeed时如何提取带title属性的span岗位名称
问题解决方法
问题根源
你当前使用item.find('span')会默认匹配当前节点下的第一个span标签,而部分岗位的「new」标注span排在岗位名span之前,因此会优先抓取到无关的new文本。
目标岗位名的span带有专属特征:存在title属性,直接按这个特征筛选即可跳过干扰标签,精准定位到岗位名。
修改后的代码
首先修正原代码的缩进错误、参数缺失问题,同时替换span的匹配逻辑:
import requests from bs4 import BeautifulSoup def extract(page): # 补充User-Agent避免被反爬拦截 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'} url = f'https://www.indeed.com/jobs?l=Bakersfield%2C%20CA&start={page}&vjk=42cee666fbd2fae9' # 明确指定headers参数 r = requests.get(url, headers=headers) soup = BeautifulSoup(r.content, 'html.parser') return soup def transform(soup): divs = soup.find_all('div', class_ = 'heading4 color-text-primary singleLineTitle tapItem-gutter') for item in divs: # 筛选带有title属性的span节点,strip()去除文本前后多余空格 res = item.find('span', attrs={'title': True}).text.strip() print(res) return c=extract(0) transform(c)
逻辑说明
attrs={'title': True}参数表示匹配所有带有title属性的span标签,不会受「new」标注标签的位置影响,修改后运行结果不会再出现多余的「new」文本- 补充了
User-Agent请求头,避免Indeed直接拦截你的爬取请求返回空内容 - 修正了原代码中的缩进错误、requests参数传递错误
- 如果担心部分节点没有符合要求的span导致报错,可以替换匹配逻辑加异常兼容:
job_span = item.find('span', attrs={'title': True}) res = job_span.text.strip() if job_span else '无岗位名'
内容的提问来源于stack exchange,提问作者Mendiolaa12
相关产品推荐
相关产品推荐

