使用Beautiful Soup 4如何筛选指定<li>标签组遍历职位列表?
解决Python官网职位抓取中标签匹配错误的问题
问题原因
你当前用soup.find_all('li')会抓取页面所有<li>标签,包括顶部导航、其他无关区域的标签,这些标签里没有你要的listing-company-name等class的span,导致job变量为None,后续访问job.a.text就会抛出异常。
解决方案
可以通过两种方式精准定位目标职位的<li>标签:
方法1:先定位职位列表的父容器,再遍历内部
Python官网的职位列表都包裹在一个带有特定class的<ul>容器中,先找到这个容器再提取里面的<li>,就能避开无关标签:
# 1. get website import requests import bs4 url = 'https://www.python.org/jobs/' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" } website = requests.get(url, headers=headers) soup = bs4.BeautifulSoup(website.content, 'lxml') # 先定位职位列表的父ul容器,再提取里面的li job_container = soup.find('ul', class_='job-list') jobs = job_container.find_all('li') for listing in jobs: # 2. get info job = listing.find('span', class_ = "listing-company-name") job_type = listing.find('span', class_ = "listing-job-type") job_location = listing.find('span', class_ = "listing-location") # 增加判断,避免个别职位信息缺失导致报错 if job and job_type and job_location: # 3. display info print(f'Job Title: {job.a.text}') print(f'Company: {job.br.next_sibling.strip()}') print(f'Skills Needed: {job_type.text.strip()}') print(f'Location: {job_location.text.strip()}') print('---')
方法2:直接抓取带有目标class的
每个职位的<li>标签都带有特定的class(比如listing-with-company),直接通过class筛选:
# 替换原来的jobs = soup.find_all('li')为: jobs = soup.find_all('li', class_='listing-with-company') # 后续循环逻辑和上面一致,同样建议增加非空判断
额外提示
- 增加非空判断(
if job and job_type and job_location)可以避免个别职位信息缺失时抛出异常,让脚本更健壮。 - 可以用
.strip()去除文本两端的空白字符,输出更整洁。
内容的提问来源于stack exchange,提问作者Donj
相关产品推荐
相关产品推荐

