我使用维基百科的API来获取有关页面的信息。 API给了我这样的JSON:
"query":{
"pages":{
"188791":{
"pageid":188791,
"ns":0,
"title":"Vanit\u00e9",
"langlinks":[
{
"lang":"bg",
"*":"Vanitas"
},
{
"lang":"ca",
"*":"Vanitas"
},
ETC.
}
}
}
}
您可以看到the full JSON response。
我想获得所有条目:
{
"lang":"ca",
"*":"Vanitas"
}
但是pages
对象中的数字键(“188791”)是个问题。
我发现Find a value within nested json dictionary in python解释了我如何枚举值。
不幸的是我得到以下异常:
TypeError: 'dict_values' object does not support indexing
我的代码是:
json["query"]["pages"].values()[0]["langlinks"]
这可能是一个愚蠢的问题,但我无法找到传递页面ID值的方法。
答案 0 :(得分:3)
一种解决方案是使用indexpageids
参数,例如:http://fr.wikipedia.org/w/api.php?action=query&titles=Vanit%C3%A9&prop=langlinks&lllimit=500&format=jsonfm&indexpageids。它将为响应添加一组pageid。然后,您可以使用它来访问字典。
答案 1 :(得分:2)
只要您一次只查询一个页面,Simeon Visser's answer就可以了。但是,作为一个好的风格,我建议您构建代码,以便迭代所有返回的结果,即使您知道应该只有一个:
for page in data["query"]["pages"].values():
title = page["title"]
langlinks = page["langlinks"]
# do something with langlinks...
特别是,通过这种方式编写代码,如果您发现自己需要为多个页面运行查询,则可以使用单个MediaWiki API请求有效地执行此操作。
答案 2 :(得分:1)
您正在使用Python 3而values()
现在返回dict_values
而不是list
。这是a view on the values of the dictionary。
因此,这就是因为索引失败而导致错误的原因。可以在列表中进行索引,但不能在视图中进行索引。
修复它:
list(json["query"]["pages"].values())[0]["langlinks"]
答案 3 :(得分:1)
如果你真的只想任意一页,那就像Simeon Visser建议的那样。
但我怀疑你想要所有页面中的所有langlinks,是吗?
为此,你需要一个理解:
[page["langlinks"] for page in json["query"]["pages"].values()]
但是当然这会给你一个2D列表。如果你想迭代每个页面的链接,这是完美的。如果您想一次迭代所有langlinks,您想要展平列表:
[langlink for page in json["query"]["pages"]
for langlink in page["langlinks"].values()]
......或......
itertools.chain.from_iterable(page["langlinks"]
for page in json["query"]["pages"].values())
(后者为您提供了一个迭代器;如果您需要一个列表,请将整个内容包装在list
中。相反,对于前两个,如果您不需要一个列表,只是任何迭代,使用parens而不是方括号来获得生成器表达式。)