Python爬虫报错AttributeError:'NoneType'对象没有'find_all'属性的问题求助
解决AttributeError: 'NoneType' object has no attribute 'find_all'的问题
这个报错的根源很清晰:你的代码里s = soup.find('div', class_='entry-content')这行返回了None——也就是说,你请求到的页面里根本找不到带有entry-content类名的div元素,后续调用find_all自然就会触发NoneType的属性错误。
通常这种情况有两个主要原因,对应两种解决思路:
1. 网站的反爬机制拦截了你的请求
直接用requests.get()发起请求时,你的请求头会暴露这是一个爬虫程序,网站可能会返回简化版页面、验证码页面或者空内容,导致找不到目标元素。
解决方法是给请求添加浏览器的请求头,伪装成正常用户访问:
import requests from bs4 import BeautifulSoup # 模拟Chrome浏览器的请求头,你也可以换成其他浏览器的UA headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } # 携带headers发起请求 r = requests.get('https://www.preparedfoods.com/articles/106989-irish-pork-crisis', headers=headers) # 先检查请求是否成功,避免拿到403/404这类错误页面 r.raise_for_status() soup = BeautifulSoup(r.content, 'html.parser') print(soup.title) # 先判断目标元素是否存在,再调用方法 s = soup.find('div', class_='entry-content') if s: lines = s.find_all('p') for line in lines: print(line.text.strip()) else: print("未找到目标div元素,请检查页面结构或反爬策略")
2. 目标网站的页面结构已经变更
如果加了请求头还是找不到元素,很大概率是网站更新了页面结构,原来的entry-content类名已经被替换,或者内容所在的标签类型变了(比如换成了section、article标签)。
解决步骤:
- 打开目标页面,按F12打开浏览器开发者工具;
- 用元素选择器定位到文章内容区域,查看它的父元素的class、id或其他属性;
- 修改代码里的
find参数,比如如果现在内容在class="article-body"的section里,就改成s = soup.find('section', class_='article-body'); - 也可以先打印
soup.prettify(),查看实际请求到的HTML内容,确认目标内容是否存在。
最后提醒一句:以后写爬虫的时候,养成先判断find/find_all返回值是否为None的习惯,能避免很多这类低级错误。
内容的提问来源于stack exchange,提问作者sivaram2001
相关产品推荐
相关产品推荐

