使用Tweepy将推文列表转DataFrame及存储JSON遇错求助
解决推文列表转DataFrame及JSON保存的问题
看起来你遇到的问题核心是拿到的searched_tweets数据类型和你预期的不一样——你以为是Twitter API返回的Tweet对象,但实际上可能已经被转换成了字典(dict),所以才会出现_json属性不存在、tweet.id取不到的错误。我给你一步步拆解解决方案:
第一步:先确认你的数据结构
先跑几行代码看看searched_tweets里的内容到底是什么类型,这是解决问题的关键:
# 打印第一条数据的类型和部分内容 print("数据类型:", type(searched_tweets[0])) print("数据内容:", searched_tweets[0])
如果输出是<class 'dict'>,说明你拿到的是字典列表;如果是<class 'tweepy.models.Status'>(或类似Tweet对象),那就是官方API返回的对象。
第二步:修复JSON保存的write_tweets函数
原来的函数调用tweet._json是针对Tweet对象的,但如果是字典的话直接用字典本身就行。修改成兼容两种类型的版本:
import json def write_tweets(tweets, filename): with open(filename, 'w', encoding='utf-8') as f: for tweet in tweets: # 兼容Tweet对象和字典两种情况 tweet_data = tweet._json if hasattr(tweet, '_json') else tweet json.dump(tweet_data, f, ensure_ascii=False, indent=2) f.write('\n')
这样不管是对象还是字典,都能正常写入JSON文件了。
第三步:转成DataFrame的正确写法
同样要兼容两种数据类型,提取tweetID和其他字段:
import pandas as pd # 初始化空列表准备存数据 tweet_data = [] for tweet in searched_tweets: # 判断是Tweet对象还是字典 if hasattr(tweet, 'id'): # 处理Tweet对象 entry = { 'tweetID': tweet.id, 'text': tweet.text, 'created_at': tweet.created_at # 其他你需要的字段,比如user_id等,直接用tweet.xxx } elif isinstance(tweet, dict): # 处理字典类型 entry = { 'tweetID': tweet.get('id'), 'text': tweet.get('text'), 'created_at': tweet.get('created_at') # 其他字段用tweet.get('键名'),避免键不存在报错 } else: # 遇到未知类型,跳过或记录错误 print(f"跳过未知类型的数据: {type(tweet)}") continue tweet_data.append(entry) # 转成DataFrame DataSet = pd.DataFrame(tweet_data) # 查看结果 print(DataSet.head())
额外提醒
如果你是用tweepy库调用API,注意有些搜索方法返回的是迭代器,需要先转换成列表再处理:
# 比如用tweepy搜索后,先转成列表 searched_tweets = list(api.search_tweets(q="关键词"))
这样后续处理就不会有迭代器的问题。
内容的提问来源于stack exchange,提问作者A.Papa
相关产品推荐
相关产品推荐

