如何用try-catch处理NoneType对象无get_text属性的AttributeError并抓取全部趋势?
无推文计数条目的兼容处理方案
报错触发逻辑非常明确:部分趋势条目内部不存在承载推文计数的span节点,job_elem.find('span')返回None值后,直接调用get_text()就会抛出AttributeError。只要在提取计数文本前增加空值判断,就能兼容所有条目,完整输出全部趋势内容,不需要改动核心的页面解析逻辑。
关键调整方向
- 所有趋势条目内的名称
a标签是固定存在的,这部分内容可以正常提取,不会触发空值错误 - 提取推文计数时,先判断
find()的返回值是否为有效元素:存在就取对应文本,不存在就设置占位文本,避免对None对象调用方法 - 给请求增加常规浏览器请求头,减少被目标站点反爬机制拦截的概率,提升脚本稳定性
可直接运行的修改后代码
from bs4 import BeautifulSoup import requests URL = "https://trends24.in/india/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } html_resp = requests.get(URL, headers=headers, timeout=10) soup = BeautifulSoup(html_resp.content, 'html.parser') trend_container = soup.find(id='trend-list') trend_items = trend_container.find_all('li') for item in trend_items: # 提取趋势名称,a标签固定存在 trend_title = item.find('a').get_text(strip=True) # 兼容无计数span的条目 count_tag = item.find('span') trend_count = count_tag.get_text(strip=True) if count_tag else "无公开推文计数" print(f"{trend_title} | {trend_count}")
补充说明:如果不想单独做空值判断,也可以用
try-except块包裹计数提取逻辑,捕获到AttributeError时返回默认值,实现效果和空值判断完全一致,提前做空值判断的逻辑可读性更好,执行效率也更高。
内容的提问来源于stack exchange,提问作者pkk
相关产品推荐
相关产品推荐

