PyCharm報(bào)錯(cuò)AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘問題的原因分析及解決方案
一、摘要
在使用 BeautifulSoup 解析網(wǎng)頁時(shí),AttributeError: 'NoneType' object has no attribute 'find_all' 是一個(gè)十分常見卻又讓人頭疼的錯(cuò)誤。本篇博客將從開發(fā)場(chǎng)景與技術(shù)細(xì)節(jié)出發(fā),全面剖析該異常的多種成因,并給出從入門到進(jìn)階的 15+ 種解決方案,幫助你徹底搞定 find_all 相關(guān)的 NoneType 問題。
二、開發(fā)環(huán)境
- 操作系統(tǒng):macOS
- Python 版本:3.10.x / 3.11.x
- IDE:PyCharm 2025
- 解析庫(kù):beautifulsoup4 >= 4.11.1
- HTTP 請(qǐng)求:requests >= 2.28.1
三、異常場(chǎng)景及技術(shù)細(xì)節(jié)
在執(zhí)行如下代碼時(shí):
from bs4 import BeautifulSoup
import requests
resp = requests.get("https://example.com")
soup = BeautifulSoup(resp.text, "html.parser")
items = soup.find("div", class_="item-list").find_all("li")
如果頁面結(jié)構(gòu)與預(yù)期不符(例如 .item-list 不存在),soup.find(...) 返回 None,隨之調(diào)用 .find_all 時(shí)就會(huì)拋出:
AttributeError: 'NoneType' object has no attribute 'find_all'
技術(shù)上,該異常表明對(duì) None(空值)進(jìn)行了成員方法調(diào)用。根本原因即上一層查找未命中或返回了錯(cuò)誤類型。
四、核心排查思路與解決方案
4.1 檢查選擇器是否正確
CSS 語法、類名大小寫:確認(rèn) HTML 結(jié)構(gòu)與選擇器一致
示例:
tag = soup.select_one("div.item-list")
if not tag:
raise ValueError("頁面未包含 .item-list 節(jié)點(diǎn)")
items = tag.find_all("li")
4.2 網(wǎng)絡(luò)請(qǐng)求與響應(yīng)狀態(tài)
有時(shí)請(qǐng)求被重定向、攔截或返回 404,導(dǎo)致 resp.text 中無預(yù)期內(nèi)容。
if resp.status_code != 200:
print(f"請(qǐng)求失?。篐TTP {resp.status_code}")
resp.raise_for_status()
4.3 不同解析器差異
html.parser vs lxml vs html5lib
更換解析器重試:
BeautifulSoup(resp.text, "lxml")
4.4 加強(qiáng) None 檢查與容錯(cuò)
container = soup.find("div", id="main-container")
if container is None:
# 打印日志或拋出自定義異常
print("未找到 #main-container,檢查頁面結(jié)構(gòu)")
else:
elements = container.find_all("p")
五、進(jìn)階排查流程


六、常見場(chǎng)景與對(duì)策總結(jié)
| 場(chǎng)景 | 原因與對(duì)策 |
|---|---|
| 找不到標(biāo)簽 | ① 選擇器不對(duì) ② 頁面腳本動(dòng)態(tài)渲染,用 Selenium 或 API |
| None 直接鏈?zhǔn)秸{(diào)用 | 加入 if tag is None 檢查 |
| 請(qǐng)求被攔截或返回 404/302 | 檢查 resp.status_code,設(shè)置合適的 headers |
| 使用默認(rèn)解析器解析失敗 | 換用 lxml 或 html5lib |
| 頁面內(nèi)容通過 JavaScript 動(dòng)態(tài)加載 | 使用 Selenium、Playwright 或抓包 API |
| 目標(biāo)節(jié)點(diǎn)深度嵌套,忘記逐級(jí)查找 | 分步打印中間結(jié)果,定位哪一級(jí)返回 None |
七、小貼士
“最好的解析器不是代碼,而是對(duì)頁面結(jié)構(gòu)的深入理解。”
遇到類似問題時(shí),先不要驚慌,按以上思路逐層排查,往往能在 5 分鐘內(nèi)搞定。
以上就是PyCharm報(bào)錯(cuò)AttributeError: ‘NoneType‘ object has no attribute ‘find_all‘問題的原因分析及解決方案的詳細(xì)內(nèi)容,更多關(guān)于PyCharm AttributeError NoneType的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- pandas報(bào)錯(cuò)AttributeError: DataFrame object has no attribute ix問題
- 解決python報(bào)錯(cuò):AttributeError:?'ImageDraw'?object?has?no?attribute?'textbbox'
- Python 中 AttributeError: ‘NoneType‘ object has no attribute ‘X‘ 錯(cuò)誤問題解決方案
- 一步真實(shí)解決AttributeError:‘Upsample‘?object?has?no?attribute‘recompute_scale_factor‘的問題
- Python進(jìn)程崩潰AttributeError異常問題解決
相關(guān)文章
OpenCV學(xué)習(xí)之圖像加噪與濾波的實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了OpenCV中圖像的加噪與濾波操作的相關(guān)資料,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02
python使用循環(huán)打印所有三位數(shù)水仙花數(shù)的實(shí)例
今天小編就為大家分享一篇python使用循環(huán)打印所有三位數(shù)水仙花數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
python中Flask框架簡(jiǎn)單入門實(shí)例
這篇文章主要介紹了python中Flask框架簡(jiǎn)單入門實(shí)例,以一個(gè)hello程序簡(jiǎn)單分析了Flask框架的使用技巧,需要的朋友可以參考下2015-03-03
Windows下Anaconda的安裝和簡(jiǎn)單使用方法
這篇文章主要介紹了Windows下Anaconda的安裝和簡(jiǎn)單使用方法,需要的朋友可以參考下2018-01-01
Python處理字節(jié)串:struct.pack和struct.unpack使用
這篇文章主要介紹了Python處理字節(jié)串:struct.pack和struct.unpack使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
python自定義函數(shù)中的return和print使用及說明
這篇文章主要介紹了python自定義函數(shù)中的return和print使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

