Python爬虫运行报'NoneType' object is not subscriptable错误如何解决?
问题原因分析
- 循环变量命名冲突:你代码中
for results in results:将存储所有a标签的列表变量results直接覆盖为单个a标签对象,会导致循环逻辑异常。 - 未处理无href属性的a标签:部分a标签不存在href属性,调用
results.get("href")会返回None,直接对None执行[:5]切片操作就会触发你遇到的TypeError: 'NoneType' object is not subscriptable报错。 - 切片位置修改操作无效:你将
[:5]移入get括号的操作没有实际作用,get("href"[:5])等价于get("href"),既没有解决None值的问题,也没有实现对href值切片匹配的需求。 - 缺少请求头标识:维基百科会拦截没有携带User-Agent的爬虫请求,你直接发送的get请求大概率返回的是拦截页面,而非正常的词条内容,所以即使修复语法问题也不会输出目标链接。
- 域名使用有误:你填写的
www.wikipedia.com会自动跳转到维基百科官方域名wikipedia.org,跳转逻辑也可能影响返回内容,建议直接使用官方词条地址。
修复后的代码
from bs4 import BeautifulSoup import requests # 增加请求头模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url = "https://en.wikipedia.org/wiki/Computer" response = requests.get(url, headers=headers) data = response.text soup = BeautifulSoup(data, "lxml") all_links = soup.find_all("a") for link in all_links: href = link.get("href") # 先判断href不为空,再做前缀匹配 if href and href[:5] == "https": print(href)
补充说明
你也可以用
str.startswith()方法更直观的实现前缀匹配,把判断条件改成if href and href.startswith("https")即可,代码可读性更高。
内容的提问来源于stack exchange,提问作者Jeiku05
相关产品推荐
相关产品推荐

