尝试访问 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_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 的回答中所指出的,我发现在调试类似这样的东西时使用漂亮的打印很有用。它是标准 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_url
s:
all_media_urls = [
media['media_url']
for image in images
for media in image['entities']['media']
]
请记住,在使用像 tweepy 这样的东西时,一定要检查文档,因为它们可能会很好地布局结构。此外,任何已经被 json 模块成功 loads
' 的东西现在只是一个你可以与之交互的普通字典,没有什么特别的。
希望对您有所帮助!
我是解析 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_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 的回答中所指出的,我发现在调试类似这样的东西时使用漂亮的打印很有用。它是标准 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_url
s:
all_media_urls = [
media['media_url']
for image in images
for media in image['entities']['media']
]
请记住,在使用像 tweepy 这样的东西时,一定要检查文档,因为它们可能会很好地布局结构。此外,任何已经被 json 模块成功 loads
' 的东西现在只是一个你可以与之交互的普通字典,没有什么特别的。
希望对您有所帮助!