从json数据结构中提取值

时间:2013-03-16 04:50:04

标签: python json

我正在调用API并获得以下数据结构:

{u'query': {u'pages': {u'120714': {u'ns': 0, u'pageid': 120714, u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'}}, u'userinfo': {u'anon': u'', u'id': 0, u'name': u'2620:0:862:101:0:0:2:4'}}}

我想要的是从这个数据结构中获取大小,我知道如何从这里提取数据但问题是在提取时我不知道页面之后的键(120714),例如:

lets assign this to a variable = d
>>> d
{u'query': {u'pages': {u'120714': {u'title': u'Daniel Nannskog', u'ns': 0, u'pageid': 120714, u'revisions': [{u'size': 985}]}}, u'userinfo': {u'anon': u'', u'id': 0, u'name': u'2620:0:862:101:0:0:2:4'}}}
>>> d['query']['pages']['120714']['revisions']
[{u'size': 985}]
>>> 

但是如何在不知道提取之前二级密钥的值的情况下获得大小呢?

2 个答案:

答案 0 :(得分:2)

如果您说密钥120714未知,那么如果d['query']['pages']下只有一个密钥,则执行以下操作:

e = d['query']['pages']
key = e.keys()[0]
print e[key]['revisions']

看起来像这样:

>>> d = {u'query': {u'pages': {u'120714': {u'title': u'Daniel Nannskog', u'ns': 0, u'pageid': 120714, u'revisions': [{u'size': 985}]}}, u'userinfo': {u'anon': u'', u'id': 0, u'name': u'2620:0:862:101:0:0:2:4'}}}
>>> e = d['query']['pages']
>>> key = e.keys()[0]
>>> print e[key]['revisions']
[{u'size': 985}]

答案 1 :(得分:2)

这个问题不是很清楚,但我会尝试猜测你正在尝试做什么,希望即使我猜对了,它也会告诉你答案。

您不知道自己拥有的网页。但是你知道,无论你有什么页面,你都想要它们的大小。换句话说,您希望访问pages的所有值,无论这些值具有哪些键。

这正是dict.values所做的:

sizes = [page['revisions'][0]['size'] for page in d['query']['pages'].values()]

如果您不理解列表理解,请让它分解:

pages = d['query']['pages']
# {u'120714': {u'ns': 0, u'pageid': 120714, 
#              u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'}}
every_page = pages.values()
# [{u'ns': 0, u'pageid': 120714,
#   u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'}]
sizes = []
for page in every_page:
    # {u'ns': 0, u'pageid': 120714,
    #  u'revisions': [{u'size': 985}], u'title': u'Daniel Nannskog'}
    sizes.append(page['revisions'][0]['size'])

请注意,我只选择了第一个修订版。如果你想要所有的修改'尺寸,或最大,或它们的总和,或最新的,或其他东西,它不是很难修改。

同样的事情适用于页面。如果你只想要第一页,或者最大,或者跨页面的大小总和,或者其他什么,那么你也可以改变它。

例如,如果您知道只有一个页面只有一个修订版,则整个内容会缩减为:

size = d['query']['pages'].values()[0]['revisions'][0]['size']