我试图从一个给定的维基百科页面获得所有的外发链接到其他维基百科文章和它们各自的分类。
不知何故,许多页面被返回w/o类别,尽管它们显然属于某些页面。它甚至似乎并不是系统性的,即没有类别返回的页面并不总是相同的。
下面的示例是我所能做的最小的例子:
# -*- 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()
如果有人想知道:继续的东西在这里解释:查询
发布于 2014-06-24 05:22:35
问题是,由于连续性的工作方式,您不能只对结果进行update()
并期望它工作。
例如,假设您有以下带有类别的链接页面:
现在,如果将gpllimit
和cllimit
设置为2(即每个响应最多包含两个页面,最多包含两个类别),则结果将跨三个连续响应,如下所示:
- page 2
- category 2A
如果要使用update()
组合这些响应,那么响应2的结果将覆盖响应1的结果:
因此,您需要做的是使用一种更聪明的方法来组合响应。或者更好的是使用访问API的现有库之一。
https://stackoverflow.com/questions/24311738
复制