Tweepy调用Twitter API返回结果转JSON遇TypeError问题求助
Tweepy调用Twitter API的数据处理问题解决
问题描述
作为Python新手,用Tweepy调用Twitter API后,返回结果是一个庞大的list类型数据,尝试转JSON失败,添加以下代码时触发报错:
searched_tweets_dict = json.loads(searched_tweets) print(searched_tweets_dict)
报错信息:
Traceback (most recent call last): File "E:\Dropbox\Backup\Github\Python\Mid_Journey\Search.py", line 33, in <module> searched_tweets_dict = json.loads(searched_tweets) File "C:\Pthyon_3.10\lib\json\__init__.py", line 339, in loads raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not list
同时想找类似Node.js中map的方法,筛选出有用的数据。
原调用代码(补全缺失的tweepy导入):
import Auth_Codes import json import tweepy twitter_auth_keys = { "consumer_key" : Auth_Codes.consumer_key, "consumer_secret" : Auth_Codes.consumer_secret, "access_token" : Auth_Codes.access_token, "access_token_secret" : Auth_Codes.access_token_secret } auth = tweepy.OAuthHandler( twitter_auth_keys["consumer_key"], twitter_auth_keys["consumer_secret"] ) auth.set_access_token( twitter_auth_keys["access_token"], twitter_auth_keys["access_token_secret"] ) api = tweepy.API(auth) searched_tweets = [tweet for tweet in tweepy.Cursor(api.search_tweets, q = "What you want to search", lang = 'en', result_type = 'recent', count = 1) .items(1)] print(searched_tweets) print(type(searched_tweets))
解决方案
1. 为什么json.loads()报错?
json.loads()的作用是把JSON格式的字符串解析成Python对象,而你传入的searched_tweets是包含TweepyStatus对象的列表,不是JSON字符串,所以触发类型错误。
要把结果转成JSON,需要先把每个Status对象转成可序列化的字典,再用json.dumps()生成JSON字符串。Tweepy的Status对象自带_json属性,直接调用就能拿到该推文的字典格式数据:
# 把单条推文转成格式化的JSON字符串 single_tweet_json = json.dumps(searched_tweets[0]._json, indent=2) print(single_tweet_json) # 把所有推文转成格式化的JSON字符串 all_tweets_json = json.dumps([tweet._json for tweet in searched_tweets], indent=2) print(all_tweets_json)
2. 类似Node.js map的筛选方法
Python里可以用列表推导式(比map更常用,逻辑一致)来筛选需要的字段。比如只提取推文文本、作者用户名、发布时间:
# 筛选有用字段,生成新的字典列表 filtered_tweets = [ { "推文内容": tweet.text, "作者用户名": tweet.author.screen_name, "发布时间": tweet.created_at.strftime("%Y-%m-%d %H:%M:%S") } for tweet in searched_tweets ] # 转成带中文的格式化JSON字符串 filtered_json = json.dumps(filtered_tweets, ensure_ascii=False, indent=2) print(filtered_json)
如果想用map函数,写法如下:
def extract_tweet_info(tweet): return { "推文内容": tweet.text, "作者用户名": tweet.author.screen_name, "发布时间": tweet.created_at.strftime("%Y-%m-%d %H:%M:%S") } filtered_tweets = list(map(extract_tweet_info, searched_tweets))
补充说明
Tweepy的Status对象还有很多其他属性,比如tweet.id_str(推文ID字符串)、tweet.retweet_count(转发数)等,你可以根据需求在筛选时添加对应的字段。
内容的提问来源于stack exchange,提问作者November Falls
相关产品推荐
相关产品推荐

