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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:17:51