如何用BeautifulSoup从RemoteOK招聘页面提取隐藏表格数据?
解决RemoteOK招聘信息提取问题
我正在学习Python课程,本次作业要求提取https://remoteok.com/remote-python-jobs页面上的招聘信息。我已编写的代码如下:
import requests from bs4 import BeautifulSoup def extract(term): url = f"https://remoteok.com/remote-{term}-jobs" request = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}) if request.status_code == 200: soup = BeautifulSoup(request.text, 'html.parser') table = soup.find_all('table', id="jobsboard") print(len(table)) for tbody in table: tbody.find_all('tbody') print(len(tbody)) else: print("can't request website") extract("python")
运行后,print(len(table))输出1,print(len(tbody))输出131,但我未能正确提取招聘数据。我怀疑请求HTML文本并通过BeautifulSoup解析时未获取完整页面,但不确定具体问题所在。
问题分析
你的代码不是因为没获取完整页面,而是解析逻辑存在错误:
soup.find_all('table', id="jobsboard")返回的是包含目标表格的列表,遍历该列表时,变量tbody实际是整个table元素,print(len(tbody))输出的是这个table的子节点总数,而非招聘条目对应的tbody数量- 你执行了
tbody.find_all('tbody')但没有将结果保存,无法后续提取招聘数据
修正后的代码
import requests from bs4 import BeautifulSoup def extract(term): url = f"https://remoteok.com/remote-{term}-jobs" # 完善请求头,降低被反爬拦截的概率 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'} request = requests.get(url, headers=headers) if request.status_code == 200: soup = BeautifulSoup(request.text, 'html.parser') # 直接获取唯一的jobsboard表格(id唯一) jobsboard_table = soup.find('table', id="jobsboard") if jobsboard_table: # 获取表格下所有的tbody,每个tbody对应一条招聘信息 job_entries = jobsboard_table.find_all('tbody') print(f"共找到 {len(job_entries)} 条招聘条目") # 跳过第一个tbody(通常是页面的辅助内容,非招聘信息) for idx, entry in enumerate(job_entries[1:], start=1): # 提取核心招聘字段 job_title = entry.find('h2', itemprop="title") company_name = entry.find('h3', itemprop="name") job_location = entry.find('div', class_="location") job_salary = entry.find('div', class_="salary") print(f"\n第 {idx} 条招聘:") print(f"职位名称:{job_title.get_text(strip=True) if job_title else '无'}") print(f"公司名称:{company_name.get_text(strip=True) if company_name else '无'}") print(f"工作地点:{job_location.get_text(strip=True) if job_location else '无'}") print(f"薪资范围:{job_salary.get_text(strip=True) if job_salary else '无'}") else: print("未找到招聘信息表格") else: print(f"请求失败,状态码:{request.status_code}") extract("python")
关键修正点
- 用
soup.find替代find_all获取目标表格(id具有唯一性,无需返回列表) - 明确获取表格下的所有
tbody并存储,这些tbody就是单个招聘条目容器 - 跳过第一个
tbody(页面结构中第一个tbody通常是隐藏的表头或占位内容) - 完善请求头,避免被网站的反爬机制拦截
- 针对每个招聘条目,提取职位、公司、地点、薪资等核心字段
内容的提问来源于stack exchange,提问作者Jun Ha
相关产品推荐
相关产品推荐

