维基百科Mediawiki API如何通过URL获取页面ID

15

我有一组完整的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中提取页面标题,通过获取最后一个斜杠("/")和最后一个字符的子字符串,然后查询API以获取页面ID。

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

5个回答

7
我不确定你所说的“页面id”是页面的识别号码(例如,英文维基百科主页的15580374--在左列工具箱中的“页面信息”中找到)还是解析重定向后页面的规范化标题。下面的答案将回答这两个问题。
您可以使用API action=query,例如:https://en.wikipedia.org/w/api.php?action=query&titles=Main%20Page,其中您会找到最少的信息,包括页面id(数字)。
您可能还想处理更复杂的情况:标题规范化和/或重定向。标题规范化(初始大写,下划线改为空格,各种Unicode规范化等等)已经包含在内。对于重定向,您必须通过在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_title。此外,page_title可能包含非英语UTF8编码文本。这些文本不一定会出现在URL中,并且显示为一堆音译文本。 - Shreyas Chavan

5

2

我在这里只是为其他在谷歌上遇到此页面的人粘贴一些可用的代码。我找不到通过API执行此操作的方法,此代码片段转到实际页面并从中提取page_id。使用beautifulsoup和regex来完成。

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)

1
据我所知,这是唯一一个实际回答了所提出问题的答案。 - gauss256

2

如果你只有URL,而不知道关于维基的任何信息,那么你不能假设最后一个/之后的部分是页面标题,因为MediaWiki页面名称可能包含/。相反,你需要通过查询siteinfo API来开始,像这样:

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

在回复中,query.general.serverquery.general.articlepath的组合将给出您的URL结构,而query.general.script将给出scriptpath。根据您的URL来源,您需要它们两个来处理默认表单//mywiki/scriptpath/index.php?title=Namespace:Foo/Bar和短URL表单//mywiki/articlepath/Namespace:Foo/Bar,对于名为Foo/Bar的文章。
更糟糕的是,“文章名称”中的斜杠可以是名称的一部分,也可以是子页面的分隔符,这取决于该命名空间的设置!
如果您知道手头维基的URL语法,@Seb35已经回答了您所有的问题。

0

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

这个回答的哪个部分涉及到只有URL可用的事实? - Ken Ingram
我再也不会使用这个API了。这个答案可能已经过时了。 - freezed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接