首页 > 解决方案 > 如何从 tweepy 类中解析子元素

问题描述

我已经编写了解析推文 JSON 的代码。我想分别使用媒体内容和非媒体内容。问题是媒体内容仅出现在少数推文中,我不明白如何区分媒体和非媒体内容。

for tweet in tweets:
            #pdb.set_trace()
            #if tweet.entities.media:
            twitterData.append({"id": tweet.id,"entities":tweet.entities,"text":tweet.text,"user":tweet.user.name,"img":tweet.user.profile_image_url,"retweet_count":tweet.retweet_count,"source":tweet.source,"source_url":tweet.source_url,"created_at":tweet.created_at,"media_image_url":tweet.entities.media.media_url }) 

此代码有效,但我现在很困惑如何解析那些包含媒体的推文

我试过这个方法

for tweet in tweets:
        #pdb.set_trace()
        if tweet.entities.media:
            twitterData.append({"id": tweet.id,"entities":tweet.entities,"text":tweet.text,"user":tweet.user.name,"img":tweet.user.profile_image_url,"retweet_count":tweet.retweet_count,"source":tweet.source,"source_url":tweet.source_url,"created_at":tweet.created_at,"media_image_url":tweet.entities.media.media_url }) 

但它给出了错误

'dict' object has no attribute 'media'

这是正确的,因为所有推文都不包含媒体属性。

有人可以帮我在这里写逻辑吗?这样我就可以分别访问媒体推文和非媒体推文?

JSON响应是这样的:

https://justpaste.it/55roi

注意:由于大小和 URL 缩短器限制,必须在 SO 之外粘贴,这是 JSON 对象的一部分。

标签: pythonjsontwitter

解决方案


您可以使用hasattr,如下所示:

for tweet in tweets:
    #pdb.set_trace()
    if hasattr(status.entities, 'media'):
    #if tweet.entities.media:
        twitterData.append({"id": tweet.id,"entities":tweet.entities,"text":tweet.text,"user":tweet.user.name,"img":tweet.user.profile_image_url,"retweet_count":tweet.retweet_count,"source":tweet.source,"source_url":tweet.source_url,"created_at":tweet.created_at,"media_image_url":tweet.entities.media.media_url })

False如果media缺少该属性,它将返回。


推荐阅读