已做非空判断仍触发TypeError: NoneType对象不可下标访问
解决爬虫中
track['duet']['handle']的空值/不存在报错问题 你当前的代码只判断了handle是否为None,但忽略了两种更先触发错误的场景:
track中不存在'duet'键,直接用track['duet']会抛出KeyErrortrack['duet']本身就是None,此时取handle会抛出TypeError(NoneType无法通过索引取值)
这两种情况都会让你的判断代码直接崩溃,根本走不到else分支。下面是几种可行的修复方案:
方案1:逐层安全判断(最直观)
先确认duet存在且不为None,再检查handle:
def create_song_list(track): duet = track.get('duet') # 用get避免键不存在的KeyError,不存在则返回None if duet is not None and duet.get('handle') is not None: duetpartner = duet['handle'] else: duetpartner = 'Solo' return { 'Duet_partner': duetpartner }
方案2:嵌套get()一步到位(最简洁)
利用dict.get()的默认值特性,逐层兜底:
def create_song_list(track): # 若duet不存在/为None,返回空字典;再取handle,不存在/为None则返回'Solo' duetpartner = track.get('duet', {}).get('handle', 'Solo') return { 'Duet_partner': duetpartner }
方案3:异常捕获(覆盖所有意外情况)
如果不确定还有其他潜在错误,直接捕获异常:
def create_song_list(track): try: duetpartner = track['duet']['handle'] # 额外处理handle本身为None的情况 if duetpartner is None: duetpartner = 'Solo' except (KeyError, TypeError): # 捕获键不存在或duet为None的错误 duetpartner = 'Solo' return { 'Duet_partner': duetpartner }
内容的提问来源于stack exchange,提问作者Sir Muffington
相关产品推荐
相关产品推荐

