You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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")

关键修正点

  1. 用soup.find替代find_all获取目标表格(id具有唯一性,无需返回列表)
  2. 明确获取表格下的所有tbody并存储,这些tbody就是单个招聘条目容器
  3. 跳过第一个tbody(页面结构中第一个tbody通常是隐藏的表头或占位内容)
  4. 完善请求头,避免被网站的反爬机制拦截
  5. 针对每个招聘条目,提取职位、公司、地点、薪资等核心字段

内容的提问来源于stack exchange,提问作者Jun Ha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:15:38