为何出现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
相关产品推荐
相关产品推荐

