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

使用BeautifulSoup爬取网页时报NoneType无text属性错误怎么解决?

问题原因

  • 你调用find_all('li')获取的是指定div下所有li标签,其中包含了没有dt子标签的空节点、结构不完整的li(你提供的HTML片段里就有<li>...</li>的占位无效节点),遍历到这些节点时,name.dt实际为None,调用.text就会触发'NoneType' object has no attribute 'text'的报错。
  • 你打印name.dt显示为Tag类型,只是因为你刚好测试打印的是存在dt标签的有效li,不是所有li都符合结构要求。

解决方法

方法1:加判断过滤无效节点

在提取文本前先判断dt是否存在,同时可以提前筛选带ntr类的有效li,减少无效遍历:

import requests
from bs4 import BeautifulSoup

res = requests.get('https://www.babynamesdirect.com/baby-names/indian/boy/trending')
soup = BeautifulSoup(res.text, 'html5lib')
# 只筛选class为ntr的有效li
li_list = soup.find('div', class_ = 'ntb boy').find_all('li', class_='ntr')
# 加判断过滤dt为空的节点,strip()去除文本前后多余空格换行
names = [name.dt.text.strip() for name in li_list if name.dt]
print(names)

方法2:直接精准定位目标标签

用CSS选择器直接定位所有名字对应的dt标签,从根源上避免无效节点:

res = requests.get('https://www.babynamesdirect.com/baby-names/indian/boy/trending')
soup = BeautifulSoup(res.text, 'html5lib')
# 直接匹配目标dt标签
dt_list = soup.select('div.ntb.boy dt.nvar')
names = [dt.text.strip() for dt in dt_list]
print(names)

补充:如果个别dt标签存在但内容为空,你可以额外加判断过滤空文本,比如if dt.text.strip()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:27:08