我能够从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
对象,但是所有推文中都不可用media_url
的extended_entities
。因此,如果我尝试这样获取:
tweet_record['media_url'] = tweet.extended_entities.media_url
它出错,因为extended_entities
可能不存在一些推文中。
如何正确处理此问题并正确获取媒体内容?
您在这里有几个选项,您可以检查键是否存在,或使用一些尝试/除外。
检查密钥是否存在:
您可以这样做,因为鞭打返回一个状态对象,该对象的作用类似于JSON文件或Python Dictionary,因此您本质上有一个键:值对。您应该能够使用(按照上述代码进行)
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,但是出于某种原因,媒体_URL却没有怎么办?而且,如果您想从中获得更多(没有一个状态对象,但是,我只是想在这里进行以后的证明!)看起来最好的
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的,如果太多使用的话可能很难阅读。
查找此答案时,我提到了这个问题。如果您需要进一步的帮助,就可以为这种事情提供一些好主意。
希望会有所帮助。
另外,一个不错的选择是在if-Statement中使用hasattr(Object, name)
:
if hasattr(tweet, "extended_entities"):
# do whatever