tweepy庫輸出twitter全文,而不是省略號
在使用tweepy庫的時候可能有的人會遇到一個問題,明明已經使用了擴展模式,爲什麼打印出來的full_text還是有省略號?像下面這樣:
說明:
標準API方法
任何tweepy.API返回Status對象的方法都接受一個新 tweet_mode參數。此參數的有效值爲compat和 extended,分別提供兼容模式和擴展模式。默認模式(如果未提供任何參數)是兼容模式。
-
兼容模式
默認情況下,使用兼容模式,根據需要text將tweepy.API方法返回的Status對象的屬性截斷爲140個字符。發生這種截斷時,truncatedStatus對象的屬性將爲True,並且僅完全包含在可用140個字符範圍內的實體將包括在該entities屬性中。還可以看出,textStatus對象的屬性被截斷了,因爲該屬性的後綴是省略號,空格和到Tweet的縮短的永久鏈接。 -
擴展模式
使用擴展模式時,方法text返回的Status對象的屬性將 tweepy.API替換爲一個full_text屬性,該屬性包含Tweet的整個未截斷文本。該truncated狀態對象的屬性會False和entities屬性將包含所有的實體。此外,Status對象將具有一個 display_text_range屬性,即兩個Unicode代碼點索引的數組,用於標識Tweet可顯示內容的包含性開始和排除性結束。 -
流
默認情況下,流中的Status對象可能包含一個extended_tweet 屬性,該屬性表示Tweet的原始數據/有效負載中的等效字段。該屬性/字段僅適用於包含子字段字典的擴展推文。該full_text詞典的entities 子字段/關鍵字將包含Tweet的完整,未截斷的文本,並且子字段/關鍵字將包含完整的實體集。如果存在擴展實體,則extended_entities子字段/鍵將包含這些實體的完整集合。此外,display_text_range子字段/關鍵字將包含兩個Unicode代碼點索引的數組,用於標識Tweet可顯示內容的包含性開始和排除性結束。 -
辦理轉推
當將擴展模式與Retweet一起使用時,full_textStatus對象的屬性可能會用省略號字符截斷,而不是包含Retweet的全文。但是,由於 retweeted_status(作爲Retweet的Status對象的)full_text屬性本身就是一個Status對象,因此可以改用Retweeted Status對象的屬性。
這同樣適用於狀態對象/有效負載,它們是來自流的轉推。來自extended_tweet屬性/字段的詞典包含一個full_text子字段/鍵,該 子字段/鍵可能會被省略號省略。而是可以使用extended_tweet“轉發狀態”的retweeted_status屬性/字段(來自屬性/字段)。
例子
給定現有tweepy.API對象並id用於Tweet,以下內容可用於打印Tweet的全文,或者如果是Retweet,則打印Retweeted Tweet的全文:
status = api.get_status(id, tweet_mode="extended")
try:
print(status.retweeted_status.full_text)
except AttributeError: # Not a Retweet
print(status.full_text)
如果status是Retweet,則status.full_text可能會被截斷。
此狀態事件處理程序用於StreamListener打印Tweet的全文,或者如果是Retweet,則打印Retweeted Tweet的全文:
def on_status(self, status):
if hasattr(status, "retweeted_status"): # Check if Retweet
try:
print(status.retweeted_status.extended_tweet["full_text"])
except AttributeError:
print(status.retweeted_status.text)
else:
try:
print(status.extended_tweet["full_text"])
except AttributeError:
print(status.text)
如果status是Retweet,則它將沒有extended_tweet屬性,並且status.text可能被截斷。
--------------------------------------------------------------------------------------------------------------------------------
所以可以寫一個on_status函數,
def on_status(status):
if hasattr(status, "retweeted_status"): # Check if Retweet
try:
print(tweet.created_at, "->", status.retweeted_status.full_text)
except AttributeError:
print(tweet.created_at, "->", status.retweeted_status.text)
else:
try:
print(tweet.created_at, "->", status.full_text)
except AttributeError:
print(tweet.created_at, "->", status.text)
public_tweets = api.user_timeline(id='LeoDiCaprio', count=100, tweet_mode='extended')
for tweet in public_tweets:
print("--------------")
print(tweet.created_at, "->", tweet.full_text)
on_status(status=tweet)
效果對比:
就可以打印出全文了。
詳細內容可參考:Extended Tweets