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

爬取维基百科代码出现AttributeError: 'NoneType'无findAll属性求助

解决AttributeError: 'NoneType' object has no attribute 'findAll'问题

这个错误的核心原因是bsobj.find("div",{"id":"bodycontent"})返回了None——也就是说BeautifulSoup在你获取的页面里找不到id为bodycontent的div元素。大概率是因为维基百科的反爬机制拦截了你的请求,返回的不是正常的页面内容(比如人机验证页面),或者页面结构已经和教程里的版本不一样了。

我给你两个关键修复方向:

1. 添加请求头,模拟浏览器访问

直接用urlopen发起请求时,没有携带任何请求头,很容易被维基百科识别为机器人,返回异常页面。我们需要添加User-Agent来模拟正常浏览器请求:

from urllib.request import urlopen, Request
from bs4 import BeautifulSoup
import re

# 构造带请求头的请求,模拟浏览器
req = Request(
    url="https://en.wikipedia.org/wiki/Kevin_Bacon",
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
)
html = urlopen(req)
bsobj = BeautifulSoup(html, 'lxml')

# 先判断是否找到目标div,避免直接调用findAll报错
target_div = bsobj.find("div", {"id": "bodycontent"})
if target_div:
    for link in target_div.findAll("a", href=re.compile("^(/wiki/)((?!:).)*$")):
        if 'href' in link.attrs:
            print(link.attrs['href'])
else:
    print("找不到id为bodycontent的div元素,请检查请求是否成功或页面结构是否变化")

2. 适配可能变化的页面结构

如果添加请求头后还是找不到bodycontent,可以先打印bsobj.prettify()查看返回的页面内容,确认当前维基百科的正文区域id是否修改。比如现在维基百科的正文内容可能在div#mw-content-text里,你可以把查找目标换成这个:

target_div = bsobj.find("div", {"id": "mw-content-text"})

额外小提示

  • 爬取维基百科时,记得遵守它的爬虫规则,不要频繁发起请求,避免被封禁IP。
  • 可以加入异常处理逻辑,比如捕获URLError,处理请求超时、连接失败等情况。

内容的提问来源于stack exchange,提问作者Beginner4258

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:33:15