Tweepy导出推文内容被截断:如何完整写入文本文件?
解决长推文写入文本文件被截断的问题
嘿,这问题我之前也碰到过!原因其实很简单:Twitter API对超过140字符的长推文,不会把完整内容放在常规的tweet['text']字段里,而是存在专门的extended_tweet结构里。你之前的代码应该没处理这个情况,所以才会被截断。
下面是修正后的完整代码,我帮你考虑了普通长推文、转发长推文的场景,还加了避免乱码的细节:
import json import tweepy class MyStreamListener(tweepy.StreamListener): def on_data(self, data): tweet = json.loads(data) # 直接获取用户名,不用json.dumps转成字符串 user = tweet['user']['screen_name'] # 处理不同类型的推文,拿到完整内容 if 'extended_tweet' in tweet: # 普通长推文 tweet_body = tweet['extended_tweet']['full_text'] elif 'retweeted_status' in tweet: # 处理转发的推文,包括转发的长推文 retweeted = tweet['retweeted_status'] if 'extended_tweet' in retweeted: tweet_body = f"RT @{retweeted['user']['screen_name']}: {retweeted['extended_tweet']['full_text']}" else: tweet_body = f"RT @{retweeted['user']['screen_name']}: {retweeted['text']}" else: # 普通短推文 tweet_body = tweet.get('text', '') # 写入文件,用utf-8编码避免表情、特殊字符乱码,追加模式不覆盖之前的内容 with open('tweets.txt', 'a', encoding='utf-8') as f: f.write(f"@{user}: {tweet_body}\n\n") return True # 别忘了创建Stream对象时加上tweet_mode='extended'! auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) stream = tweepy.Stream(auth=auth, listener=MyStreamListener(), tweet_mode='extended')
几个关键的点要注意:
- 必须加
tweet_mode='extended'参数:在创建Stream对象时指定这个,Twitter API才会返回长推文的完整内容字段,不然你根本拿不到extended_tweet数据。 - 区分普通推文和转发推文:转发的长推文内容嵌套在
retweeted_status里,得逐层解析。 - 用utf-8编码写入文件:推文里经常有表情、非英文字符,不加编码很容易乱码。
- 别乱用json.dumps:用户名和推文内容本身就是字符串,直接用就行,json.dumps会额外给你加引号,反而添乱。
这样修改后,不管多长的推文(包括带链接、表情的)都能完整写入文本文件啦!
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

