爬取维基百科代码出现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
相关产品推荐
相关产品推荐

