Twitter天气机器人触发TypeError: bool不可下标报错原因
报错原因与修正方案
报错触发位置
报错完全来自get_location函数里的这行代码:
tweet_location = [i.strip("#") for i in tweet.split() if i.startswith("#")[0]]
- Python的字符串
startswith()方法执行后返回布尔值(True/False),本身不支持下标索引。你在方法调用的结果后面直接加[0],相当于对布尔值做取字符操作,直接触发TypeError: 'bool' object is not subscriptable。 - 这个写法本身是冗余的:
startswith("#")的作用就是判断字符串是否以#开头,完全不需要额外加[0]来做判断。
修正步骤
- 删掉过滤条件里多余的
[0],把判断逻辑改成正确的写法:if i.startswith("#") - 解决列表无法直接拼接字符串的问题:原代码里
tweet_location是列表类型,直接用+= " today weather.com"拼接字符串会触发类型错误,需要先把提取到的标签内容转成空格分隔的字符串,再拼搜索词。
修正后的get_location函数参考:
def get_location(tweet): # 提取所有带#的话题,去掉#前缀 location_tags = [word.lstrip("#") for word in tweet.split() if word.startswith("#")] # 无有效标签时直接返回空值 if not location_tags: return "" search_query = f"{' '.join(location_tags)} today weather.com" return search_query
额外需要优化的逻辑
- 现在的代码只要推文里带任意#就会触发查询,没有判断提取到的标签是否为有效位置信息。如果
get_location返回空字符串,要直接跳过后续的天气查询、发推流程,避免调用无效接口。 get_weather函数里的url变量是在搜索循环内部定义的,如果搜索没返回有效结果,后续构造请求时会出现变量未定义的报错,可以在循环外初始化url为空值,加判空后再执行网页抓取逻辑。
内容的提问来源于stack exchange,提问作者J_Simm
相关产品推荐
相关产品推荐

