使用Python的requests与BeautifulSoup爬取网页遇AttributeError求助
修复网页爬取中的AttributeError问题
问题重现
你的代码尝试爬取动漫分类列表,但运行时触发以下错误:
import requests from bs4 import BeautifulSoup url = 'https://otakudesu.lol/genre-list/' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') genres_div = soup.find('div', class_='genres') genre_links = genres_div.find_all('a') path = [] text = [] for link in genre_links: path.append(link['href']) text.append(link.text) print(path) print(text)
错误信息:
genre_links = genres_div.find_all('a') ^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'find_all'
错误原因
这个错误说明soup.find('div', class_='genres')没有找到目标元素,返回了None,后续调用find_all自然会报错。主要有两个可能:
- 网站启用了反爬机制,直接用
requests.get请求被拦截,返回的内容不是真实页面,自然找不到目标元素。 - 页面结构发生变化,原来的
class="genres"的div已经不存在或改名了。
修复方案
1. 添加请求头模拟浏览器访问
大部分网站会检查请求的User-Agent,判断是否是爬虫。我们可以在请求中加入浏览器的User-Agent,模拟正常访问:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers)
2. 增加元素存在性判断
即使请求成功,也可能因为页面结构变化找不到元素,所以要先判断genres_div是否为None,再执行后续操作:
if genres_div: genre_links = genres_div.find_all('a') # 后续处理逻辑 else: print("未找到目标元素,请检查页面结构或选择器")
3. 验证页面结构(可选)
如果添加请求头后还是找不到元素,建议手动打开目标网页,右键检查元素,确认目标分类所在的div的class是否还是genres,或者是否有其他层级结构需要调整选择器。
完整修复代码
import requests from bs4 import BeautifulSoup url = 'https://otakudesu.lol/genre-list/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) # 确认请求成功 if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') genres_div = soup.find('div', class_='genres') if genres_div: genre_links = genres_div.find_all('a') path = [] text = [] for link in genre_links: path.append(link['href']) text.append(link.text.strip()) print(path) print(text) else: print("未找到class为'genres'的div元素,请检查页面结构") else: print(f"请求失败,状态码:{response.status_code}")
内容的提问来源于stack exchange,提问作者Saiful Miqdar
相关产品推荐
相关产品推荐

