如何检查扭曲响应中是否存在扩展的ententfy

时间:2019-03-19 14:18:06

标签: python twitter tweepy

我能够从tweet获取不同的tweet参数。

    keyword = tweepy.Cursor(api.search, val,tweet_mode='extended',lang='en').items(2)
    tweetdone = 0
    all_tweet = []
    for tweet in keyword:
        tweet_record = {} 
        tweet_record['tweet.text'] = tweet.full_text
        tweet_record['tweet.user.name'] = tweet.user.name
        tweet_record['tweet.user.location'] = tweet.user.location
        tweet_record['tweet.user.verified'] = tweet.user.verified
        tweet_record['tweet.lang'] = tweet.lang
        tweet_record['tweet.created_at'] = tweet.created_at
        tweet_record['tweet.user'] = tweet.user
        tweet_record['tweet.retweet_count'] = tweet.retweet_count
        tweet_record['tweet.favorite_count'] = tweet.favorite_count

我的问题是。我想从推文中解析media对象。但是存在媒体URL的extended_entities并非在所有推文中都可用。 因此,如果我尝试以这种方式获取它

tweet_record['media_url'] = tweet.extended_entities.media_url

由于扩展实体可能不会出现在少数推文中,因此会出现错误。

如何处理此问题并正确获取媒体内容?

2 个答案:

答案 0 :(得分:0)

您在这里有两个选择,您可以检查密钥是否存在,或使用一些try / excepts。

检查密钥是否存在:

之所以可以这样做,是因为tweepy返回一个状态对象,该对象的行为类似于json文件或python字典,因此,您实际上具有一个key:value对。您应该可以使用(按照上面的代码操作)

if 'extended_entities' in tweet:
    tweet_record['media_url'] = tweet.extended_entities.media_url

当然,也可以相反

if 'extended_entities' not in tweet:
    #whatever you want to do

这可能会导致问题,如果extended_entities存在,但由于某些原因,media_url不存在怎么办?还有,如果您想从中获得更多的收益(这里没有状态对象,但是,我只是想在这里证明未来!)您将不得不做长的或多嵌套的if语句,看起来不是最好的

if 'extended_entities' in tweet:
    if 'media_url' in tweet['extended_entities']
        #etc

因此,只需尝试将其扔掉,可能会更容易,除了...

try:
    tweet_record['media_url'] = tweet.extended_entities.media_url
except AttributeError:
    #etc

这意味着当找不到特定元素时程序不会出错。 AttributeError用于访问对象的无效属性。您当然可能需要重新排序以提高可读性。不过请记住,这样做pythonic时,如果我认为使用得太频繁,可能会有点难以阅读。

在查找有关此答案的内容时,我提到了this question。如果您需要进一步的帮助,请提供一些很好的想法。

希望有帮助。

答案 1 :(得分:0)

此外,一个不错的选择是在 if 语句中使用 hasattr(Object, name)

if hasattr(tweet, "extended_entities"):
\# do whatever