如何处理NoneType无attrs属性问题:遇空值跳过函数执行
解决BeautifulSoup查找元素为None时跳过后续代码的问题
嘿,这个场景太常见了!用BeautifulSoup的时候链式调用很容易踩这个NoneType的坑,我来给你几个靠谱的解决方案。
核心问题拆解
你原来的代码bs4.find("div", {'class': "clock"}).attrs['data-code']会报错,是因为当find()找不到匹配的div时,会返回None,而None没有attrs属性,直接访问就会抛出AttributeError。所以关键是先判断查找结果是否存在,再执行后续操作。
方案1:分步判断(最直观)
把链式调用拆成两步,先获取元素,再判断是否为None,只有存在时才去拿data-code:
# 先获取目标div元素 clock_div = soup.find("div", {'class': "clock"}) # 检查元素是否存在 if clock_div is not None: # 确认存在后再访问attrs属性 data_code = clock_div.attrs['data-code'] # 这里写你需要用data_code执行的后续代码 print(f"获取到data-code: {data_code}") else: # 找不到元素时直接跳过,或者执行其他逻辑 pass
方案2:用get()方法更安全(兼容属性不存在的情况)
如果目标div存在,但可能没有data-code属性,直接用attrs['data-code']还是会报错。这时候用get()方法更稳妥,它会在属性不存在时返回None而不是抛出异常:
clock_div = soup.find("div", {'class': "clock"}) if clock_div: # 用get()获取属性,不存在则返回None data_code = clock_div.get('data-code') if data_code is not None: # 只有拿到有效data-code时才执行后续代码 print(f"获取到data-code: {data_code}") else: # 元素存在但没有data-code属性时跳过 pass else: # 元素不存在时跳过 pass
方案3:用海象运算符简化代码(Python 3.8+)
如果你用的是Python 3.8及以上版本,可以用海象运算符:=把判断和赋值合并,让代码更简洁:
# 一步完成元素查找和存在性判断 if clock_div := soup.find("div", {'class': "clock"}): # 再一步完成属性获取和有效性判断 if data_code := clock_div.get('data-code'): # 执行后续代码 print(f"获取到data-code: {data_code}")
这样不管是找不到div,还是div没有data-code属性,都会直接跳过后续的代码逻辑,不会中断程序执行。
内容的提问来源于stack exchange,提问作者CDNthe2nd
相关产品推荐
相关产品推荐

