【问题标题】:Wikipedia Mediawiki API get Pageid from URLWikipedia Mediawiki API 从 URL 获取 Pageid
【发布时间】:2015-07-28 17:43:02
【问题描述】:

我有一组完整的网址,例如

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 找到 wikipedia pageids。我以前使用过 Mediawiki API,但我不知道该怎么做。

我尝试通过获取 lastindexof("/") 的子字符串和最后一个字符,然后查询 API 以获取 pageid,从 URL 中提取页面标题。

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 中找到维基百科页面的 pageid?

【问题讨论】:

    标签: mediawiki wikipedia-api mediawiki-api mediawiki-extensions


    【解决方案1】:

    您可以将 &indexpageids 添加到您的查询中。

    例如

    https://en.wikipedia.org/w/api.php?action=query&format=json&titles=Main%20Pages&indexpageids

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

    https://en.wikipedia.org/w/api.php?action=query&format=json&titles=barberton%20daisy&prop=extracts&exintro&explaintext&redirects=1&indexpageids

    然后,如果您解析 JSON,您将在查询下看到一个名为 pageids 的属性

    【讨论】:

      【解决方案2】:

      我不确定您所说的“页面 id”是页面的标识号(例如,英语维基百科主页的 15580374 - 可在左栏中工具箱的“页面信息”中找到)还是标准化标题已解决重定向的页面。下面的答案将同时回答。

      您可以使用 API action=query,例如https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page 在这里您可以找到最少的信息,其页面 id(编号)。

      您还可以管理更复杂的情况:标题规范化和/或重定向。标题规范化(首字母大写、下划线更改为空格、各种 unicode 规范化 iirc 等)是开箱即用的。对于重定向,您必须通过在 URL 中添加“&redirects”来特别询问(请注意,双重重定向(=重定向的重定向)不起作用,但不应该存在)。示例:https://en.wikipedia.org/w/api.php?action=query&titles=main_page&redirects

      如果您需要更多信息,可以查看https://en.wikipedia.org/w/api.php?action=help&modules=query%2Binfo

      【讨论】:

      • 感谢您的回答。我知道这两种方法,但都没有帮助我的事业。在您的两个答案中,我都需要一个 page_title 来使用。我没有 page_title,我只有 URL。这就是问题所在。 URL 不能通过子字符串转换为 page_titles。 page_titles 也可以包含非英语 UTF8 编码的文本。不一定会出现在 URL 中并显示为一堆音译文本。
      • 好的。因此,您必须首先按照您所说的提取子字符串,然后调用 API 来规范化标题并解析重定向(即使使用 % 编码的标题,如 ar.wikipedia.org/w/…),对于非拉丁字符,您必须进行编码返回到 UTF8 的字符串(例如,对于法语单词“Café”,API 返回“title”:“Caf\u00e9”,其中“é”是 Unicode U+E9)。
      【解决方案3】:

      使用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"
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        如果您只有 URL,并且对 wiki 一无所知,则不能假定最后一个 / 之后的部分是页面标题,因为 MediaWiki 页面名称为 may contain /。相反,您必须先查询 siteinfo API,如下所示:

        https://www.mediawiki.org/wiki/API:Siteinfo
        

        在回复中,query.general.serverquery.general.articlepath 组合会给你 url 结构,query.general.script 会给你scriptpath。根据您的网址的来源,您将需要它们的展位,以说明默认形式//mywiki/scriptpath/index.php?title=Namespace:Foo/Bar,以及短网址形式//mywiki/articlepath/Namespace:Foo/Bar,用于名为Foo/Bar 的文章。

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

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

        【讨论】:

          【解决方案5】:

          将在此处粘贴一些工作代码,以供在 google 中浏览此页面的其他人使用。我找不到通过 api 执行此操作的方法,此代码 sn-p 转到实际页面并从那里提取 page_id。使用 beautifulsoup 和正则表达式来完成。

          import requests
          from bs4 import BeautifulSoup
          import time
          import re
          
          # Here list_of_urls is the list of urls 
               #['http://en.wikipedia.org/wiki/Episkopi_Bay', etc.]
          
          list_page_ids = []
          
          for url in list_of_urls:        
              page = requests.get(url)
              soup = BeautifulSoup(page.content, 'html.parser')
              script_content = soup.select_one("head > script:nth-of-type(1)").decode_contents()
              page_id = re.search(r".*wgArticleId..([0-9]+).*",script_content).group(1)
              list_page_ids.append[page_id]
              time.sleep(3)
          
          print(list_page_ids)
          

          【讨论】:

            猜你喜欢
            • 2015-07-12
            • 1970-01-01
            • 1970-01-01
            • 2015-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多