我是解析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'}}}]},
看起来像它的内部entities
image['entities']['media']
我收到以下错误
正确,因为media
不是从JSON加载的字典的键之一;它是entities
键下的子命令的键。因此,您需要image['entities']['media']
。类似地,查看该命令并获得media_url
:image['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的答案中指出的那样,我发现在调试类似这样的命令以使用漂亮的打印时很有用。它是标准库/模块的一部分,因此不在导入/下载之外。
简单地
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
处理的任何内容现在都只是您可以与之交互的普通命令,没什么特别的。
希望这会有所帮助!