Wikipedia Mediawiki API从URL获取页面ID

Wikipedia Mediawiki API从URL获取页面ID,mediawiki,wikipedia-api,mediawiki-api,mediawiki-extensions,Mediawiki,Wikipedia Api,Mediawiki Api,Mediawiki Extensions,我有一套完整的URL,如 http://en.wikipedia.org/wiki/Episkopi_Bay http://en.wikipedia.org/wiki/Monte_Lauro http://en.wikipedia.org/wiki/Lampedusa http://en.wikipedia.org/wiki/Himera http://en.wikipedia.org/wiki/Lago_Cecita http://en.wikipedia.org/wiki/Aspromont

我有一套完整的URL,如

http://en.wikipedia.org/wiki/Episkopi_Bay
http://en.wikipedia.org/wiki/Monte_Lauro
http://en.wikipedia.org/wiki/Lampedusa
http://en.wikipedia.org/wiki/Himera
http://en.wikipedia.org/wiki/Lago_Cecita
http://en.wikipedia.org/wiki/Aspromonte
我想找到这些URL的维基百科页面ID。我以前使用过Mediawiki API,但我不知道该怎么做

我尝试从URL中提取页面标题,方法是获取lastindexof(“/”)的子字符串和最后一个字符,然后查询API以获取pageid

http://en.wikipedia.org/wiki/Episkopi_Bay --> Episkopi_Bay
http://en.wikipedia.org/wiki/Monte_Lauro --> Monte_Lauro
http://en.wikipedia.org/wiki/Lampedusa -- > Lampedusa
http://en.wikipedia.org/wiki/Himera --> Himera
http://en.wikipedia.org/wiki/Lago_Cecita --> Lago_Cecita
http://en.wikipedia.org/wiki/Aspromonte --> Aspromonte
但问题是,我的一些链接可能是重定向的,因此子字符串可能并不总是页面的标题


TL;DR:如何从URL中找到wikipedia页面的pageid?

我不确定您所说的“页面id”是该页面的标识号(例如,英文wikipedia主页的15580374,可在左栏“页面信息”中找到)还是已解析重定向的页面的标准化标题。下面的答案将同时回答这两个问题

您可以使用API action=query,例如,您将在其中找到页面id(编号)的最小信息

您还可以管理更复杂的案例:标题规范化和/或重定向。标题规范化(首字母大写、下划线改为空格、各种unicode规范化iirc等)是现成的。对于重定向,您必须通过在URL中添加“&redirects”(注意,双重定向(=重定向的重定向)将不起作用,但不应该存在)。例如:


如果您需要更多信息,可以查看。

如果您只有URL,并且对wiki一无所知,则不能假定最后一个
/
后面的部分是页面标题,就像MediaWiki页面名称
/
一样。相反,您必须从查询siteinfo API开始,如下所示:

https://www.mediawiki.org/wiki/API:Siteinfo
在回复中,
query.general.server
query.general.articlepath
组合将提供url结构,而
query.general.script
将提供url结构。根据url的来源,您需要它们来解释名为
Foo/Bar
的文章的默认格式
//mywiki/scriptpath/index.php?title=Namespace:Foo/Bar
,以及短url格式
//mywiki/articlepath/Namespace:Foo/Bar

更糟糕的是,“项目名称”中的斜杠可以是名称的一部分,也可以是子页面的分隔符,具体取决于名称空间的设置


如果您知道手边wiki的url语法,@Seb35已经回答了您所有的问题。

使用
action=query
的API调用为您提供了文章的
pageid

https://xx.wikipedia.org/w/api.php?action=query&format=json&titles=searched_title
给出一个类似JSON的示例:

{
    "batchcomplete": "",
    "query": {
        "pages": {
            "xxxx": {
                "pageid": xxxx,
                "ns": 0,
                "title": "searched_title"
            }
        }
    }
}

您可以将&indexpageid添加到查询中

比如说

或者,如果您同时在寻找摘要,这里有一个更全面的示例链接:


然后,如果解析JSON,您将在query下看到一个名为pageID的属性,谢谢您的回答。这两种方法我都知道,但对我的事业毫无帮助。在你的两个答案中,我都需要一个页面标题。我没有网页标题,我只有网址。这就是问题所在。URL不能通过子字符串转换为页面标题。页面标题也可以包含非英语UTF8编码文本。它不一定存在于URL中,而是显示为一堆音译文本。因此,您必须首先按照您所说的提取子字符串,然后调用API以规范化标题并解析重定向(即使使用%-编码的标题,如),对于非拉丁字符,您必须将返回的字符串编码为UTF8(例如,对于法语单词“Café”,API返回“title”:“Caf\u00e9”,其中“é”是Unicode U+E9)。