区分Wiki中的文章页和列表/消歧义页
我正在使用 'https://en.wikipedia.org/wiki/Special:Random' 随机生成维基百科的页面,并用 BeautifulSoup 来读取这些页面。问题是,我只想要像这样的文章页面:
http://en.wikipedia.org/wiki/Ada_County,_Idaho
但有时候我得到的是列表页面或者消歧义页面(这些我不想要)。比如说:http://en.wikipedia.org/wiki/List_of_U.S._counties_named_after_personal_first_names
有没有简单的方法来区分这些情况?
2 个回答
2
使用API来判断一个页面是否是消歧义页面。比如说,这个链接可以随机获取10个文章命名空间中的标题(可以在沙盒中互动尝试)。消歧义页面的属性中会包含"pageprops":{"disambiguation":""}
。不过,遗憾的是,对于列表来说没有这么简单的方法,你需要根据标题(/^List of .*/
)或类别来猜测。
2
列表页面通常可以通过查询WikiData来区分,具体是查看P31的值(这个P31代表“实例类型”)。对于列表页面,它们的值是Q13406463(也就是维基媒体的列表页面)。
https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q678323
如果你使用这种方法,你还可以同时检查消歧义页面。这些页面的值是Q4167410(也就是维基媒体的消歧义页面)。
有很多Python库可以用来和MediaWiki的API进行交互,比如说
listOfTitles = 'Ada_County,_Idaho|List_of_U.S._counties_named_after_personal_first_names'
site = wikitools.Wiki("http://www.wikidata.org/w/api.php", user, password)
site.login(user,password)
params = {'action':'wbgetentities', 'props':'claims','titles':listOfTitles,'format':'json'}
request = wikitools.APIRequest(site, params)
result = request.query()