Tweepy 截断状态

13

我正在使用 tweepy 挖掘用户时间线数据,并遇到了一些理解上的困难:

  1. “retweeted”和“truncated”属性是否指的是同一个东西(即超过140个字符的状态文本)?
  2. 如果不是,它们之间有什么区别?
  3. 我看到一个 stackoverflow 的问题,有人问如何检索因长度超过140个字符而被“截断”的状态文本。答案建议在 _json 字典中使用“retweeted”属性,如果是这种情况,则为 true,完整状态文本将在 status->retweeted_status->text 下。然而,我没有找到它,唯一的状态文本在 status->text 下以“...”结尾。我的理解是错误的吗?如果是,该怎么做才能获得完整的文本?

提前感谢您的帮助。

4个回答

19

'retweeted'和'truncated'属性是指同一件事情吗(例如,超过140个字符的状态文本)?如果不是,有什么区别?

不是,推文不仅在转发后会被截断,还可能在回复或提及后被截断(请参见我的下面的示例,这不是一条转发)。如果是这种情况,“truncated”将被设置为“True”(而“retweeted”将为True或False)。如果推文没有被截断,因为它的大小明显低于140个字符,那么“retweeted”等于True而“truncated”等于False也是可能的。

建议在 _json 字典中使用retweeted属性,如果是这种情况,完整状态文本将在status->retweeted_status->text下方。

只有当推文是真正的转发时才是如此。实际上,如果它来自另一条被截断的推文,retweeted_status本身也可能被截断。最好的方法是在Tweepy中使用tweet_mode='extended'参数检索完整文本(可惜在Tweepy文档中没有记录)。例如:

(未扩展)

print api.get_status('862328512405004288')._json['text']

@tousuncotefoot @equipedefrance @CreditAgricole @AntoGriezmann @KMbappe @layvinkurzawa @UmtitiSam 我从来没有见过这样的场景... https://tco/kALZ2ki9Vc

(extended)

print api.get_status('862328512405004288', tweet_mode='extended')._json['full_text']

我从未看过足球比赛,这将是送给我男朋友的一份好礼物!!


1
谢谢你的回答。我已经尝试过了,它按照你所解释的方式运行良好。 - Abrar Hossain

7

关于问题3)

以下是从Tweepy流监听器访问扩展状态文本的方法,假设推文超过140个字符(在这种情况下,状态对象将具有扩展推文字典)。如果推文不超过140个字符,则像往常一样获取状态文本:

class MyStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        try:
            text = status.extended_tweet["full_text"]
        except AttributeError:
            text = status.text

1
正是我所需要的。谢谢 :) 我给你点赞。 - Paula Livingstone
我很高兴它有用! :) - Jea

4

我也因为这个问题感到困扰。

在转推时,.json文件中会有两个“full_text”标签。通过调用'retweet_status'标签可以提取真正的全文。解决方案如下:

for tweet in tweepy.Cursor(api.search, q = "social", tweet_mode='extended',
                           wait_on_rate_limit = True, wait_on_rate_limit_notify = True, include_entities=True).items(10):
    try:
        print tweet.retweet.im_self._json['retweeted_status']['full_text']
    except:
        print tweet.retweet.im_self._json['full_text']


4
我最简单的方法是获取状态并搜索转发的全文。
status = api.get_status(id, tweet_mode="extended")
try:
    print(status.retweeted_status.full_text)
except AttributeError:  # Not a Retweet
    print(status.full_text)

这在搜索中也有效。

tweets=[]
for tweet in api.search(q=keyword, lang="en", count=count, tweet_mode='extended'):
    try:
       tweets.append(tweet.retweeted_status.full_text)
    except AttributeError:  # Not a Retweet
       tweets.append(tweet.full_text)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接