[尝试访问Tweepy响应中的值时发生KeyError

问题描述 投票:0回答:4

我是解析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'}}}]},
python json parsing twitter tweepy
4个回答
1
投票

看起来像它的内部entities

image['entities']['media']

1
投票

我收到以下错误

正确,因为media不是从JSON加载的字典的键之一;它是entities键下的子命令的键。因此,您需要image['entities']['media']。类似地,查看该命令并获得media_urlimage['entities']['media']['media_url']

这是只是一个字典。没关系,它来自JSON文件。数据是嵌套的,因此您一次只能访问它。


0
投票

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}

0
投票

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

简单地

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_url

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

并且请记住,在使用tweepy之类的工具时,请务必检查文档,因为它们可能会很好地布局结构。此外,通过json模块成功loads处理的任何内容现在都只是您可以与之交互的普通命令,没什么特别的。

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.