【问题标题】:Why does this Wikipedia mediawiki api request not return categories to all links?为什么这个 Wikipedia mediawiki api 请求不返回所有链接的类别?
【发布时间】:2014-06-19 16:28:57
【问题描述】:

我正在尝试获取从给定维基百科页面到其他维基百科文章及其所有各自类别的所有传出链接。

不知何故,许多页面都返回了没有类别的页面,即使它们显然属于某些页面。它甚至看起来不系统,即没有分类返回的页面并不总是相同的。

下面的例子是我能做到的最小化:

# -*- 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()

如果有人想知道:继续的东西在这里解释:http://www.mediawiki.org/wiki/API:Query#Continuing_queries

【问题讨论】:

    标签: python-3.x mediawiki wikipedia-api mediawiki-api


    【解决方案1】:

    问题在于,由于延续的工作方式,您不能只 update() 结果并期望它工作。

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

    • 第 1 页
      • 类别 1
    • 第 2 页
      • 2A 类
      • 2B 类
    • 第 3 页
      • 第 3 类

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

    • 响应 1
      • 第 1 页
        • 类别 1
      • 第 2 页
        • 2A 类
    • 响应 2
      • 第 1 页
      • 第 2 页
        • 2B 类
    • 响应 3
      • 第 3 页
        • 第 3 类

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

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

    因此,您需要做的是使用更智能的方法来组合响应。或者更好的是,使用one of the existing libraries to access the API

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多