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

BeautifulSoup报错:'NoneType'对象无find_all属性的问题求助

问题解析:Indeed爬虫出现AttributeError错误

错误信息

Traceback (most recent call last):
  File "C:/Users/det-lab/Documents/PycharmProjects/Indeed_webscrape/Indeed_job_data.py", line 23, in <module>
    alllitags = allData.find_all("li", {"class":"eu4oa1w0"})
AttributeError: 'NoneType' object has no attribute 'find_all'

你的代码实现

import requests
from bs4 import BeautifulSoup

l = []
o = {}

#declare the target URL and make an HTTP connection to that website.

target_url = 'https://www.indeed.com/jobs?q=data+analyst&l=New+York%2C+NY&from=searchOnHP&vjk=7cfb06a1924a00ef&advn\
    =8756188910781422'

head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0",
 "Accept-Encoding": "gzip, deflate, br",
  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
  "Connection": "keep-alive",
  "Accept-Language": "en-US,en;q=0.9,lt;q=0.8,et;q=0.7,de;q=0.6",
}

resp = requests.get(target_url, headers=head)

soup = BeautifulSoup(resp.text, 'html.parser')

allData = soup.find("div", {"class": "mosaic-provider-jobcards"})

#iterate over each of these li tags and extract all the data one by one using a for loop.

alllitags = allData.find_all("li", {"class":"eu4oa1w0"})

for i in range(0,len(alllitags)):
    try:
        o["name-of-the-job"]=alllitags[i].find("a").find("span").text
    except:
        o["name-of-the-job"] = None

    try:
         o["name-of-the-company"] = alllitags[i].find("span", {"data-testid":"company-name"}).text
    except:
        o["name-of-the-company"] = None
    try:
        o["job-location"] = alllitags[i].find("div", {"data-testid":"text-location"}).text
    except:
        o["job-location"] = None
    try:
        o["job-details"] = alllitags[i].find("div", {"class":"jobMetaDataGroup"}).text
    except:
        o["job-details"] = None
    try:
        o["pay-range"] = alllitags[i].find("div", {"class":"metadata salary-snippet-container"}).text
    except:
        o["pay-range"] = None

    l.append(o)
    o={}
print(l)

针对性解释

错误根源

代码中allData = soup.find("div", {"class": "mosaic-provider-jobcards"})没有找到匹配的HTML元素,返回了None。后续调用allData.find_all()时,就会触发AttributeError——因为None对象不存在find_all方法。

找不到元素的原因

  • 页面结构更新:Indeed会频繁调整页面HTML结构,你参考的教程里的mosaic-provider-jobcards类名已经失效,当前页面中不存在这个类的div容器。
  • URL带会话参数:你使用的URL包含vjk这类会话专属参数,返回的是个性化页面,结构和通用搜索页不一致。
  • 反爬拦截:即使添加了User-Agent,Indeed仍可能识别出爬虫,返回的不是正常搜索结果页(比如验证页),导致无法找到目标元素。

修复建议

  1. 检查返回内容:先打印resp.text,确认返回的是正常搜索结果页还是反爬验证页面。如果是验证页,需要补充反爬策略(比如添加Cookie、设置请求延迟)。
  2. 更新选择器:用浏览器打开通用搜索URL(比如https://www.indeed.com/jobs?q=data+analyst&l=New+York%2C+NY),通过开发者工具查看当前职位列表的父容器类名或属性,替换代码里过时的mosaic-provider-jobcards。
  3. 添加容错判断:在调用find_all前先检查allData是否有效,避免直接调用方法:
    allData = soup.find("div", {"class": "mosaic-provider-jobcards"})
    if allData:
        alllitags = allData.find_all("li", {"class":"eu4oa1w0"})
        # 后续遍历代码
    else:
        print("未找到目标容器,页面结构已更新或被反爬拦截")
    
  4. 使用通用URL:去掉URL中的vjk、advn等会话参数,改用不带个性化标识的搜索链接,保证返回页面结构稳定。

内容的提问来源于stack exchange,提问作者Jonathan Mporampora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:31:00