如何在Tweepy响应中判断扩展实体存在性并正确获取媒体内容
如何处理Twitter API中部分推文无extended_entities的情况并获取媒体URL?
我已经能通过Tweepy获取推文的各类参数,代码如下:
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获取会报错,请问该如何处理此问题并正确获取媒体内容?
这是个非常典型的Twitter API使用问题——确实不是所有推文都附带媒体内容,直接访问不存在的extended_entities属性会抛出AttributeError。我给你两种实用的处理方案,你可以根据自己的习惯选择:
方案1:使用try-except捕获异常
这是最直观的方式,尝试访问extended_entities,如果失败就将媒体URL设为空列表(或者你需要的默认值):
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 # 新增媒体URL处理逻辑 try: # 一条推文可能有多张媒体,所以收集所有media_url到列表中 media_urls = [media['media_url'] for media in tweet.extended_entities['media']] tweet_record['media_urls'] = media_urls except AttributeError: # 没有extended_entities时设为空列表 tweet_record['media_urls'] = [] all_tweet.append(tweet_record)
方案2:使用hasattr()检查属性是否存在
这种方式更显式,先判断推文对象是否有extended_entities属性,再进行处理:
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 # 新增媒体URL处理逻辑 if hasattr(tweet, 'extended_entities') and 'media' in tweet.extended_entities: media_urls = [media['media_url'] for media in tweet.extended_entities['media']] tweet_record['media_urls'] = media_urls else: tweet_record['media_urls'] = [] all_tweet.append(tweet_record)
额外小提示:
- 我把字段名改成了
media_urls而不是media_url,因为一条推文可能包含多张图片/多个媒体文件,用列表存储更合理; - 如果需要高清版本的媒体,可以用
media['media_url_https'],或者在media_url后加上:large后缀(比如media['media_url'] + ':large'); - 若要区分媒体类型(图片、视频、GIF),可以读取每个media字典里的
type字段,返回值为photo、video或animated_gif。
内容的提问来源于stack exchange,提问作者Arman Mansuri
相关产品推荐
相关产品推荐

