尝试访问 Tweepy 响应中的值时出现 KeyError

KeyError when trying to access a value in Tweepy response

我是解析 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)

我在 post

的底部复制了 "image" 的摘录

然后当我打电话时:

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'}}}]},

里面好像是entities

image['entities']['media']

I get the following error

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

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

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}

正如 np8 的回答中所指出的,我发现在调试类似这样的东西时使用漂亮的打印很有用。它是标准 library/modules 的一部分,因此不在 import/download.

之外

简单地说,

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

它通常做得很好。

您的代码

听起来您想从 Twitter 回复中提取所有 media_url。 查看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}

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

正在访问一个:

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

将一条推文中的所有 media_url 放入列表中:

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' 的东西现在只是一个你可以与之交互的普通字典,没有什么特别的。

希望对您有所帮助!