在JSON中到达未知值后面的字符串

时间:2013-11-15 21:23:45

标签: python json wikipedia-api

我使用维基百科的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值的方法。

4 个答案:

答案 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而不是方括号来获得生成器表达式。)