我可以从推文中获取不同的推文参数。
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
对象。但是所有推文中都没有提供媒体网址的extended_entities
。所以,如果我尝试像这样获取它
tweet_record['media_url'] = tweet.extended_entities.media_url
它给出了错误,因为扩展实体可能不会出现在很少的推文中。
如何处理此问题并正确获取媒体内容?
这里有几个选项,你可以检查密钥是否存在,或者使用一些try / excepts。
检查密钥是否存在:
你可以这样做,因为tweepy返回一个状态对象,它的作用类似于json文件或python字典,因此你基本上有一个键:值对。你应该可以使用(按上面的代码)
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。如果您需要进一步的帮助,可以为这类事情提供一些好的想法。
希望有所帮助。