使用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
相关产品推荐
相关产品推荐

