我能够从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
由于扩展实体可能不会出现在少数推文中,因此会出现错误。
如何处理此问题并正确获取媒体内容?
答案 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