使用python-twitter存储Twitter趋势报错:json.loads无法处理list
问题分析与解决办法
这个错误的根源很明确——你搞反了JSON处理的方向,还误解了python-twitter库API返回的数据类型。
为什么会触发这个错误?
api.GetTrendsWoeid(my_woe_id)方法返回的不是JSON字符串,而是已经被库解析好的Python列表对象(里面是Trend类的实例)。而json.loads()的作用是把JSON格式的字符串/字节转换成Python对象,你直接把一个列表传给它,自然会触发类型错误。
正确的处理步骤
你不需要对返回的my_trends做JSON解析,直接使用这个列表即可。如果要把趋势数据写入文本文件,需要做的是把Python对象序列化成JSON字符串,而不是解析。
示例代码
import json import twitter # 先正确初始化API(替换成你的密钥信息) api = twitter.Api( consumer_key="你的consumer_key", consumer_secret="你的consumer_secret", access_token_key="你的access_token_key", access_token_secret="你的access_token_secret" ) my_woe_id = 1 # 示例:全球趋势的WOEID,可根据需求替换 my_trends = api.GetTrendsWoeid(my_woe_id) # 把每个Trend对象转换成可序列化的字典 trends_dict_list = [trend.AsDict() for trend in my_trends] # 将数据写入.txt文件(本质是JSON格式的文本) with open("twitter_trends.txt", "w", encoding="utf-8") as f: json.dump(trends_dict_list, f, ensure_ascii=False, indent=4)
关键说明
trend.AsDict():python-twitter库返回的Trend对象自带这个方法,可以把对象转换成Python字典,这样才能被json.dump()正确序列化。- 如果你只是想保存纯文本格式的趋势名称(不是完整JSON),可以简化处理:
with open("trends_names.txt", "w", encoding="utf-8") as f: for trend in my_trends: f.write(f"{trend.name}\n")
额外注意点
- 确认你的
my_woe_id是有效的,可以通过api.GetTrendsAvailable()获取所有可用的地区WOEID列表。 - 确保API初始化的密钥、令牌信息正确,避免出现认证失败的问题。
内容的提问来源于stack exchange,提问作者Mohammed Alkindy
相关产品推荐
相关产品推荐

