You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:25:20