使用BeautifulSoup获取职位标题返回None,如何过滤无效结果?
问题解决方法
1. 过滤无效的None结果
提取职位标题前,先检查BeautifulSoup的find结果是否存在,避免直接调用.text导致报错或返回无效的None值。
2. 优化链接提取逻辑
原代码会抓取页面上所有含/en/job的链接,其中包含很多非职位列表的无效链接(比如导航栏、页脚链接),改为直接从职位列表容器中提取目标链接,减少无效请求。
3. 实现带序号的格式化输出
收集所有有效职位标题后,按序号逐个输出。
修改后的完整代码
from bs4 import BeautifulSoup import requests import time job_name = "python" url = f"https://www.jobstreet.com.my/{job_name}-jobs/" html_text = requests.get(url).text web_html = BeautifulSoup(html_text, "lxml") # 存储有效职位标题 valid_positions = [] def get_position(link): # 加入延时,避免请求过于频繁被反爬 time.sleep(1) page_url = f"https://www.jobstreet.com.my{link}" page_job = requests.get(page_url).text web_html2 = BeautifulSoup(page_job, "lxml") # 先查找元素,判断是否存在 position_elem = web_html2.find("h1", class_="z1s6m00 _1hbhsw64y y44q7i0 y44q7il _1d0g9qk4 y44q7is y44q7i21") if position_elem: return position_elem.get_text(strip=True) # 去除文本前后多余空格 return None # 定位职位列表容器,只提取里面的职位链接 job_list_container = web_html.find("div", class_="z1s6m00 _1hbhsw67i _1hbhsw66e _1hbhsw69q _1hbhsw68m _1hbhsw6n _1hbhsw65a _1hbhsw6ga _1hbhsw6fy") if job_list_container: # 提取所有符合class的职位链接 job_links = job_list_container.find_all('a', class_="jdlu994 jdlu996 jdlu999 y44q7i2 z1s6m00 z1s6m0f _1hbhsw6h", href=True) for link in job_links: temp_link = link.get('href') position = get_position(temp_link) if position: valid_positions.append(position) # 按序号输出有效结果 for idx, pos in enumerate(valid_positions, start=1): print(f"{idx}. Position: {pos}")
关键修改说明
- None过滤:在
get_position函数中先判断元素是否存在,仅当存在时才返回文本,否则返回None;后续收集时只保留非None的有效结果。 - 链接优化:直接从职位列表容器中提取目标class的链接,避免抓取无关页面,减少无效请求和None结果。
- 反爬处理:加入
time.sleep(1),避免短时间内大量请求被网站拦截。 - 格式化输出:使用
enumerate自动生成序号,匹配你需要的输出格式。
内容的提问来源于stack exchange,提问作者SyahmiSam
相关产品推荐
相关产品推荐

