【问题标题】:KeyError when trying to access a value in Tweepy response尝试访问 Tweepy 响应中的值时出现 KeyError
【发布时间】:2020-09-20 06:08:56
【问题描述】:

我是解析 json 文件的新手,尽管尝试了几个小时,但我还是找不到访问 json 对象中我想要的值的方法。这是我的代码:

# Access a tweet id and get the tweet info, then save to a txt file
tweet_id = df_tae['tweet_id'][0]
tweet = api.get_status(tweet_id, tweet_mode='extended')
with open('tweet_json_test.txt', "a") as outfile:
   json.dump(tweet._json, outfile)

# Later on, open the file and try to extract the 'media_url' address
with open('tweet_json_test.txt') as json_file:
    image = json.load(json_file)

我在帖子底部复制了“图片”的摘录

然后当我打电话时:

image['id']

我得到:892420643555336193,这很棒:-)

但是当我打电话时:

image['media']

我收到以下错误

KeyError                                  Traceback (most recent call last)
<ipython-input-849-665e447555a9> in <module>
----> 1 image['media']

KeyError: 'media'

如何访问 media_url 字符串?我已经尝试了我能找到和想到的一切,经过几个小时的捣乱。我知道我可以使用 tweepy API 来获取它,但希望以后能够从 json.txt 中提取它。

# The image file looks like this (extract only for brevity):
{'created_at': 'Tue Aug 01 16:23:56 +0000 2017',
 'id': 892420643555336193,
 'id_str': '892420643555336193',
 'full_text': "This is Phineas. He's a mystical boy. Only ever appears in the hole of a donut. 13/10",
 'truncated': False,
 'display_text_range': [0, 85],
 'entities': {'hashtags': [],
  'symbols': [],
  'user_mentions': [],
  'urls': [],
  'media': [{'id': 892420639486877696,
    'id_str': '892420639486877696',
    'indices': [86, 109],
    'media_url': 'http://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
    'media_url_https': 'https://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
    'url': 'https......',
    'display_url': '.....',
    'expanded_url': 'https://twitter.com/dog_rates/status/892420643555336193/photo/1',
    'type': 'photo',
    'sizes': {'thumb': {'w': 150, 'h': 150, 'resize': 'crop'},
     'medium': {'w': 540, 'h': 528, 'resize': 'fit'},
     'small': {'w': 540, 'h': 528, 'resize': 'fit'},
     'large': {'w': 540, 'h': 528, 'resize': 'fit'}}}]},

【问题讨论】:

  • “我已经尝试了我能找到和想到的所有东西,经过几个小时的折腾。”当您有一个无法弄清楚的KeyError 时,您应该尝试的第一件事是检查.keys() 实际上是什么。您可以做的另一件事是在特定于 JSON 的查看器中查看您的 JSON 文件(任何现代 Web 浏览器都应该提供),以便查看它的结构。

标签: python json parsing twitter tweepy


【解决方案1】:

看起来像它的内部entities

image['entities']['media']

【讨论】:

    【解决方案2】:

    我收到以下错误

    是的,因为media 不是从 JSON 加载的字典的键之一;它是entities 键下的子字典的键。所以你需要image['entities']['media']。类似地查看该字典并获取media_urlimage['entities']['media']['media_url']

    只是一个字典。它来自 JSON 文件并不重要。数据是嵌套的,因此您可以一次访问它。

    【讨论】:

      【解决方案3】:

      media 在另一个字典 image['entities'] 中。

      通过查看字典的键可能更容易阅读字典image 的内容:

      image.keys()
      

      或整个字典:

      import pprint
      pprint.PrettyPrinter(depth=4).pprint(image)
      

      哪个输出

      {'created_at': 'Tue Aug 01 16:23:56 +0000 2017',
       'display_text_range': [0, 85],
       'entities': {'hashtags': [],
                    'media': [{'display_url': '.....',
                               'expanded_url': 'https://twitter.com/dog_rates/status/892420643555336193/photo/1',
                               'id': 892420639486877696,
                               'id_str': '892420639486877696',
                               'indices': [...],
                               'media_url': 'http://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
                               'media_url_https': 'https://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
                               'sizes': {...},
                               'type': 'photo',
                               'url': 'https......'}],
                    'symbols': [],
                    'urls': [],
                    'user_mentions': []},
       'full_text': "This is Phineas. He's a mystical boy. Only ever appears in the "
                    'hole of a donut. 13/10',
       'id': 892420643555336193,
       'id_str': '892420643555336193',
       'truncated': False}
      

      【讨论】:

        【解决方案4】:

        正如 np8 的回答中所指出的,我发现在调试类似这样的东西以使用漂亮的打印时它很有用。它是标准库/模块的一部分,因此不在导入/下载之外。

        简单地说,

        from pprint import pprint
        # ...
        pprint(mydict)
        # or
        pprint(mylist)
        

        它通常做得很好。

        您的代码

        听起来您想从 Twitter 回复中提取所有 media_urls。 查看image dict的结构,我们可以看到...

        {'created_at': 'Tue Aug 01 16:23:56 +0000 2017',
         'display_text_range': [0, 85],
         'entities': {'hashtags': [],
                      'media': [{'display_url': '.....',
                                 'expanded_url': 'https://twitter.com/dog_rates/status/892420643555336193/photo/1',
                                 'id': 892420639486877696,
                                 'id_str': '892420639486877696',
                                 'indices': [...],
                                 'media_url': 'http://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
                                 'media_url_https': 'https://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
                                 'sizes': {...},
                                 'type': 'photo',
                                 'url': 'https......'}],
                      'symbols': [],
                      'urls': [],
                      'user_mentions': []},
         'full_text': "This is Phineas. He's a mystical boy. Only ever appears in the "
                      'hole of a donut. 13/10',
         'id': 892420643555336193,
         'id_str': '892420643555336193',
         'truncated': False}
        

        它是一个带有entities 键的字典,其值是带有media 键的字典,其值是具有media_url 键的字典列表的值。因此,要访问这些 media_urls,我们必须深入整个结构以将它们取出。

        访问一个:

        first_media_url = image['entities']['media'][0]['media_url']
        

        从一条推文中获取所有media_urls 到一个列表中:

        media_urls = [media['media_url'] for media in image['entities']['media']]
        

        (奖励)假设图像在列表中,则从所有图像中获取所有 media_urls:

        all_media_urls = [
            media['media_url']
            for image in images
            for media in image['entities']['media']
        ]
        

        记住,在使用 tweepy 之类的东西时,一定要检查文档,因为它们可能会很好地布局结构。此外,任何被 json 模块成功loads'd 的东西现在都只是一个可以与之交互的普通字典,没什么特别的。

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-02-14
          • 1970-01-01
          • 2017-06-17
          • 2018-02-05
          • 1970-01-01
          • 2021-01-26
          • 1970-01-01
          相关资源
          最近更新 更多