如何使用 Wikipedia API 在页面列表中查找特定的人关于同名的人

How to use Wikipedia API to find specific person in the page lists about people with the same name

假设我有一份宇航员名单,我想使用维基百科显示他们的传记 API。
到目前为止,我已经尝试过这个:

https://en.wikipedia.org/w/api.php?action=parse&prop=wikitext&page=Nick%20Hague

按预期工作。但是看看这个例子:

https://en.wikipedia.org/w/api.php?action=parse&prop=wikitext&page=Andrew%20Morgan

如您所见,有多个 "Andrew Morgan",这就是问题所在。如果他是 NASA 宇航员,我该如何访问 "Andrew R. Morgan" 信息。
请注意,"Andrew Morgan" 只是一个示例,它可能 change.These 名称将从另一个 API 发送给我。所以我不能每次都手动更改他们的名字。

您可以通过以下方式访问“A​​ndrew R. Morgan”的信息:

https://en.wikipedia.org/w/api.php?action=parse&prop=wikitext&page=Andrew%20R.%20Morgan

一个space表示为%20

消歧义页面都归类为 "All disambiguation pages",因此您可以检查该类别以查看您是否在消歧义页面上。

因此,您可以检查 "All_disambiguation_pages" 是否作为类别存在,以确定您是否在消歧页面上。使用查询 https://en.wikipedia.org/w/api.php?action=parse&prop=categories&page=Andrew%20Morgan:

for (category of r.parse.categories) {
    if (Object.values(category).includes("All_disambiguation_pages")) {
        // we know it's a disambiguation page
    }
}

或者,您也可以使用以下查询检查 "Disambiguation" 属性:

https://en.wikipedia.org/w/api.php?action=query&prop=pageprops&ppprop=disambiguation&redirects&format=xml&titles=Andrew%20Morgan

当然,这些只是告诉你页面是否是消歧页面。最终,您需要知道自己在寻找什么。在"Andrew Morgan"的情况下,宇航员在"Andrew R. Morgan"之下。但有些文章可能会使用 "John Doe (Astronaut)" 或其他一些标题。这没有真正的标准化。

对于"astronaut"的例子,您或许可以在消歧页面搜索关键字"astronaut",然后转到那篇文章:

fetch('https://en.wikipedia.org/w/api.php?action=opensearch&search=andrew%20morgan&format=json&origin=*')
  .then(function(response) {
    response.json().then(function(data) {
      // data[1] is the array of titles, [2] is the array of descriptions, [3] is the array of links
      let articleUrl = data[3][data[2].findIndex(element => element.includes("astronaut"))];
      if (articleUrl !== -1) { // -1 would be not found
        console.log(articleUrl); //the url
      }
    });
  });