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

