首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个Wikipedia mediawiki api请求不将类别返回到所有链接?

为什么这个Wikipedia mediawiki api请求不将类别返回到所有链接?
EN

Stack Overflow用户
提问于 2014-06-19 16:28:57
回答 1查看 801关注 0票数 1

我试图从一个给定的维基百科页面获得所有的外发链接到其他维基百科文章和它们各自的分类。

不知何故,许多页面被返回w/o类别,尽管它们显然属于某些页面。它甚至似乎并不是系统性的,即没有类别返回的页面并不总是相同的。

下面的示例是我所能做的最小的例子:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import urllib.request
import urllib.parse
import json

def link_request(more_parameters={"continue": ""}):
   parameters = {"format": "json",
                 "action": "query",
                 "generator": "links",
                 "gpllimit": "max",
                 "gplnamespace": "0",
                 "prop": "categories",
                 "cllimit": "max",
                 "titles": urllib.parse.quote(start_page.encode("utf8"))}
   parameters.update(more_parameters)

   queryString = "&".join("%s=%s" % (k, v) for k, v in parameters.items())

   # This ensures that redirects are followed automatically, documented here:
   # http://www.mediawiki.org/wiki/API:Query#Resolving_redirects
   queryString = queryString+"&redirects"

   url = "http://%s.wikipedia.org/w/api.php?%s" % (wikipedia_language, queryString)
   print(url)

   #get json data from wikimedia API and make a dictionary out of it:
   request = urllib.request.urlopen(url)
   encoding = request.headers.get_content_charset()
   jsonData = request.read().decode(encoding)
   data = json.loads(jsonData)

   return data

def get_link_data():
   data=link_request()

   query_result=data['query']['pages']

   while 'continue' in data.keys():
      continue_dict=dict()
      for key in list(data['continue'].keys()):
         if key == 'continue':
            continue_dict.update({key: data['continue'][key]})
         else:
            val= "|".join([urllib.parse.quote(e) for e in data['continue'][key].split('|')])
            continue_dict.update({key: val})
      data=link_request(continue_dict)
      query_result.update(data['query']['pages'])

   print(json.dumps(query_result, indent=4))

start_page="Albert Einstein"
wikipedia_language="en"
get_link_data()

如果有人想知道:继续的东西在这里解释:查询

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-24 13:22:35

问题是,由于连续性的工作方式,您不能只对结果进行update()并期望它工作。

例如,假设您有以下带有类别的链接页面:

  • 第1页
    • 类别1

  • 第2页
    • 2A类
    • 2B类

  • 第3页
    • 第3类

现在,如果将gpllimitcllimit设置为2(即每个响应最多包含两个页面,最多包含两个类别),则结果将跨三个连续响应,如下所示:

  • 响应1
    • 第1页
      • 类别1

代码语言:javascript
复制
- page 2 
    - category 2A

  • 响应2
    • 第1页
    • 第2页
      • 2B类

  • 响应3
    • 第3页
      • 第3类

如果要使用update()组合这些响应,那么响应2的结果将覆盖响应1的结果:

  • 第1页
  • 第2页
    • 2B类

  • 第3页
    • 第3类

因此,您需要做的是使用一种更聪明的方法来组合响应。或者更好的是使用访问API的现有库之一

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24311738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档