如何用BeautifulSoup批量爬取TimesJobs页面所有公司的招聘信息?
解决TimesJobs职位信息爬取仅获取第一条数据的问题
问题根源
你的代码中使用 soup.find_all('ul',class_="new-joblist") 只会拿到一个包含所有职位的外层容器,而非每个单独的职位条目。因此循环遍历的是这个单一容器,自然只能提取到第一条数据。
修正后的代码
import requests from bs4 import BeautifulSoup url = "https://www.timesjobs.com/candidate/job-search.html?searchType=personalizedSearch&from=submit&txtKeywords=Machine+Learning&txtLocation=" page = requests.get(url) soup = BeautifulSoup(page.content, 'lxml') # 定位每个单独的职位条目(li元素) job_items = soup.find_all('li', class_="clearfix job-bx wht-shd-bx") all_jobs = [] for job in job_items: job_data = {} # 提取公司名称 company_name = job.find('h3', class_="joblist-comp-name") job_data['company_name'] = company_name.get_text(strip=True) if company_name else "N/A" # 提取职位描述 job_desc = job.find('ul', class_="list-job-dtl clearfix") job_data['job_description'] = job_desc.get_text(strip=True) if job_desc else "N/A" # 提取工作年限和地点 top_details = job.find('ul', class_="top-jd-dtl clearfix") if top_details: details = top_details.find_all('li') if len(details) >= 2: # 处理工作年限 experience_text = details[0].get_text(strip=True) job_data['experience'] = experience_text.split('Yrs')[0].strip() if 'Yrs' in experience_text else "N/A" # 处理工作地点 location_text = details[1].get_text(strip=True) job_data['location'] = location_text.replace('location', '').strip() if 'location' in location_text else "N/A" # 提取关键技能 key_skills = job.find('span', class_="srp-skills") job_data['key_skills'] = key_skills.get_text(strip=True) if key_skills else "N/A" all_jobs.append(job_data) # 打印所有职位信息 for idx, job in enumerate(all_jobs, 1): print(f"职位 {idx}:") print(f"公司名称: {job['company_name']}") print(f"工作地点: {job['location']}") print(f"工作年限: {job['experience']}") print(f"关键技能: {job['key_skills']}") print(f"职位描述: {job['job_description']}\n")
关键修改点
- 定位职位条目: 使用
find_all('li', class_="clearfix job-bx wht-shd-bx")获取每个独立的职位卡片,而非外层的容器。 - 字段提取优化: 用
get_text(strip=True)清理文本冗余内容,并添加空值判断避免因元素缺失导致的报错。 - 数据结构化: 将每个职位的信息存入字典,再收集到列表中,方便后续批量处理或输出。
内容的提问来源于stack exchange,提问作者comrade7
相关产品推荐
相关产品推荐

