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

为何出现AttributeError: 'NoneType' object has no attribute 'find_all'错误?

AttributeError: 'NoneType' object has no attribute 'find_all' 原因及修复方案

错误原因

这个错误的核心是job_list变量为None——也就是soup.find("ul", class_="jobsearch-ResultsList")没有找到匹配的元素,后续调用find_all自然会报错。具体诱因通常有三种:

  • 页面结构变更:Indeed的网页类名可能已更新,原jobsearch-ResultsList类名的<ul>元素不存在了
  • 页面未完全加载:浏览器还没加载完页面内容就执行了解析,导致soup拿到的源码不完整
  • 反爬机制触发:Indeed检测到爬虫行为,返回的页面不含目标职位列表

修复方案

1. 先排查job_list为空的具体原因

在代码中加入调试逻辑,快速确认页面内容是否符合预期:

for page in range(pages):
    base_url = "https://kr.indeed.com/jobs"
    final_url = f"{base_url}?q={keyword}&start={page*10}"
    
    print("Requesting", final_url)
    
    browser.get(final_url)
    soup = BeautifulSoup(browser.page_source, "html.parser")
    job_list = soup.find("ul", class_="jobsearch-ResultsList")
    
    # 新增调试代码
    if not job_list:
        print("=== 未找到目标列表,页面内容预览 ===")
        print(soup.prettify()[:800])  # 打印前800字符快速排查
        continue  # 跳过当前页面,避免后续报错
    
    jobs = job_list.find_all("li", recursive=False)

2. 确保页面完全加载后再解析

使用Selenium的WebDriverWait等待目标元素加载完成,避免因网络延迟导致的内容缺失:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

for page in range(pages):
    base_url = "https://kr.indeed.com/jobs"
    final_url = f"{base_url}?q={keyword}&start={page*10}"
    
    print("Requesting", final_url)
    
    browser.get(final_url)
    # 等待目标<ul>元素出现,最多等待10秒
    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "jobsearch-ResultsList"))
    )
    soup = BeautifulSoup(browser.page_source, "html.parser")
    job_list = soup.find("ul", class_="jobsearch-ResultsList")
    jobs = job_list.find_all("li", recursive=False)

3. 验证并更新页面定位规则

手动打开目标URL,右键检查页面元素,确认职位列表的<ul>类名是否仍为jobsearch-ResultsList:

  • 如果类名已变更,直接将代码中的类名替换为新值
  • 也可以改用更稳定的CSS选择器,比如job_list = soup.select_one("ul[class*='ResultsList']")

4. 规避反爬机制

添加简单的反爬规避策略,降低被检测的概率:

import time
import random

for page in range(pages):
    base_url = "https://kr.indeed.com/jobs"
    final_url = f"{base_url}?q={keyword}&start={page*10}"
    
    print("Requesting", final_url)
    
    browser.get(final_url)
    # 随机等待2-5秒,模拟人类浏览间隔
    time.sleep(random.uniform(2, 5))
    # 模拟滚动页面,触发内容加载
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(1)
    
    soup = BeautifulSoup(browser.page_source, "html.parser")
    job_list = soup.find("ul", class_="jobsearch-ResultsList")
    if job_list:
        jobs = job_list.find_all("li", recursive=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:02:39