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

Indeed BS4爬虫job_title函数仅返回首个tbody元素的问题排查求助

问题分析与解决方案

你的job_title函数只返回第一个tbody元素的原因很明确:你把return语句放在了for循环的内部。当函数执行到第一次循环里的return t时,会立刻返回当前的结果并终止函数运行,后面的循环迭代根本没机会执行,自然拿不到所有job_seen_beacon对应的tbody内容。

修正后的代码方案

方案1:收集所有tbody元素(保留原始DOM元素)

我们可以先初始化一个空列表,在循环中把每个job_seen_beacon里的tbody元素添加进去,循环结束后再返回整个列表:

def job_title(url):
    titles = data_grabber(url)
    all_tbodys = []
    for title in titles:
        # 找到当前job_seen_beacon下的所有tbody
        tbodys_in_title = title.find_all('tbody')
        # 把找到的元素扩展到总列表中
        all_tbodys.extend(tbodys_in_title)
    return all_tbodys

方案2:更高效的单元素提取(适配Indeed常见结构)

观察Indeed的页面结构,每个job_seen_beacon卡片里通常只有一个tbody,所以用find()代替find_all()更高效,同时可以过滤掉可能的None值:

def job_title(url):
    titles = data_grabber(url)
    all_tbodys = []
    for title in titles:
        tbody = title.find('tbody')
        if tbody:  # 确保找到元素再添加,避免空值混入列表
            all_tbodys.append(tbody)
    return all_tbodys

进阶:直接提取职位标题文本

如果你的最终目标是获取职位标题文本,而不是保留tbodyDOM元素,可以进一步解析:

def job_title(url):
    titles = data_grabber(url)
    job_title_list = []
    for title in titles:
        tbody = title.find('tbody')
        if tbody:
            # 定位到职位标题的h2标签(Indeed的类名可能会变动,需注意检查)
            title_element = tbody.find('h2', class_='jobTitle')
            if title_element:
                # 提取并清理文本内容,去除多余空格
                clean_title = title_element.get_text(strip=True)
                job_title_list.append(clean_title)
    return job_title_list

关键提醒

  • 网页结构可能会随时变化,后续如果出现提取失败,记得检查Indeed的HTML元素类名或标签是否有更新。
  • 频繁爬取可能会触发反爬机制,建议添加请求头、设置爬取间隔,避免被封禁IP。

内容的提问来源于stack exchange,提问作者kieran Sweetman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:57:46