Python 尝试访问Tweepy响应中的值时出现KeyError
我是解析json文件的新手,尽管尝试了几个小时,但还是找不到访问json对象中所需值的方法。这是我的密码:Python 尝试访问Tweepy响应中的值时出现KeyError,python,json,parsing,twitter,tweepy,Python,Json,Parsing,Twitter,Tweepy,我是解析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") a
# 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']
image['media']
我得到:892420643555336193,这很好:-)
但当我打电话时:
image['id']
image['media']
我得到以下错误
KeyError Traceback (most recent call last)
<ipython-input-849-665e447555a9> in <module>
----> 1 image['media']
KeyError: 'media'
看起来像它的内部
实体
image['entities']['media']
看起来像它的内部
实体
image['entities']['media']
我得到以下错误
KeyError Traceback (most recent call last)
<ipython-input-849-665e447555a9> in <module>
----> 1 image['media']
KeyError: 'media'
对,因为media
不是从JSON加载的dict的键之一;它是实体
键下子目录的一个键。所以你需要图像['entities']['media']
。类似地,查看该dict并获取media\u url
:图像['entities']['media']['media\u url']
它只是一个dict。它是否来自JSON文件并不重要。数据是嵌套的,因此一次只能访问一个步骤
我得到以下错误
KeyError Traceback (most recent call last)
<ipython-input-849-665e447555a9> in <module>
----> 1 image['media']
KeyError: 'media'
对,因为media
不是从JSON加载的dict的键之一;它是实体
键下子目录的一个键。所以你需要图像['entities']['media']
。类似地,查看该dict并获取media\u url
:图像['entities']['media']['media\u url']
它只是一个dict。它是否来自JSON文件并不重要。数据是嵌套的,因此您可以一步一步地访问它。媒体位于另一个字典中,
图像['entities']
通过查看字典的键,可能更容易阅读字典图像的内容:
image.keys()
或者整本字典:
导入pprint
pprint.PrettyPrinter(深度=4).pprint(图像)
哪个输出
{'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']
通过查看字典的键,可能更容易阅读字典图像的内容:
image.keys()
或者整本字典:
导入pprint
pprint.PrettyPrinter(深度=4).pprint(图像)
哪个输出
{'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的回答中指出的,我发现在调试类似这样的东西时使用pretty print很有用。它是标准库/模块的一部分,因此不在导入/下载之外
简单地说
从pprint导入pprint
# ...
pprint(mydict)
#或
pprint(mylist)
它通常做得很好
你的代码
听起来你想从twitter的回复中提取出所有的media\u url
s。
查看图像的结构,我们可以看到
{'created_at':'2017年8月1日星期二16:23:56+0000',
“显示文本范围”:[0,85],
'entities':{'hashtags':[],
'媒体':[{'display_url':'…',
'扩展的url':'https://twitter.com/dog_rates/status/892420643555336193/photo/1',
“id”:892420639486877696,
“id_str”:“892420639486877696”,
“索引”:[…],
“媒体url”:”http://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
“媒体url\uHTTPS”:https://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
'大小':{…},
“类型”:“照片”,
'url':'https…'}],
“符号”:[],
“URL”:[],
“用户提到”:[]},
“全文”:“这是菲尼亚斯。他是一个神秘的男孩。只出现在电影中”
“甜甜圈的洞,13/10”,
“id”:892420643555336193,
"id_str":"89242064355533636193",
“截断”:False}
它是具有实体
键的dict,其值为具有媒体
键的dict,其值为具有媒体url
键的dict列表。因此,要访问这些媒体url
s,我们必须深入到结构中,将它们取出
访问一个:
first\u media\u url=image['entities']['media'][0]['media\u url']
将一条推文中的所有媒体url
放入列表:
media\u url=[media['media\u url']用于图像中的媒体['entities']['media']]
(额外)从所有图像中获取所有media\u url
s(假设图像在列表中):
所有\u媒体\u URL=[
媒体['media_url']
对于图像中的图像
对于图像['entities']['media']中的媒体
]
请记住,在使用tweepy之类的工具时,一定要检查文档,因为它们可能会很好地布局结构。此外,json模块成功加载的任何内容现在都只是一个普通的dict,您可以与之交互,没有什么特别之处
希望这有帮助 正如np8的回答所指出的,我发现在调试类似这样的东西时使用“漂亮打印”很有用。它是标准库/模块的一部分,因此不在导入/下载之外
简单地说
从pprint导入pprint
# ...
pprint(mydict)
#或
pprint(mylist)
它通常做得很好
你的代码
听起来你想从twitter的回复中提取出所有的media\u url
s。
查看图像的结构,我们可以看到
{'created_at':'2017年8月1日星期二16:23:56+0000',
“显示文本范围”:[0,85],
'entities':{'hashtags':[],
'媒体':[{'display_url':'…',
'扩展的url':'https://twitter.com/dog_rates/status/892420643555336193/photo/1',
“id”:892420639486877696,
“id_str”:“892420639486877696”,
“索引”:[…],
“媒体url”:”http://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',
“媒体url\uHTTPS”:https://pbs.twimg.com/media/DGKD1-bXoAAIAUK.jpg',