You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取维基百科页面的最终重定向链接?Python实现问题

获取维基百科最终重定向链接的解决方案

我需要编写Python脚本获取维基百科页面的最终重定向链接,例如访问http://en.wikipedia.org/wiki/Zzzzzz时,应返回https://en.wikipedia.org/wiki/Z_(joke_line)。但现有代码仅能处理普通HTTP 3xx重定向(如YouTube短链接),对维基百科的重定向无效。

现有代码

import requests

def get_final_url(url):
    response = requests.get(url, allow_redirects=False)
    if response.status_code in (300, 301, 302, 303, 307, 308):
        return response.headers['Location']
    else:
        return None

initial_url = "http://en.wikipedia.org/wiki/Zzzzzz"  # 替换为你的URL
final_url = get_final_url(initial_url)
print("Final URL:", final_url)

测试结果

http://en.wikipedia.org/wiki/Zzzzzz -> http://en.wikipedia.org/wiki/Zzzzzz
https://youtu.be/nMFv8YPOQdY -> https://www.youtube.com/watch?v=nMFv8YPOQdY&feature=youtu.be

问题原因

维基百科的页面重定向并非通过HTTP 3xx状态码实现,而是返回200状态码后,通过HTML中的<link rel="canonical">标签或页面内的重定向提示完成跳转,因此仅检查HTTP响应头无法获取最终链接。

解决方案

方案1:解析HTML页面获取规范链接

使用BeautifulSoup解析页面,提取<link rel="canonical">标签的href属性,这是维基百科标注的最终目标页面链接。

先安装依赖:

pip install beautifulsoup4 requests

修改后的代码:

import requests
from bs4 import BeautifulSoup

def get_wikipedia_final_url(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    # 提取canonical链接
    canonical_link = soup.find('link', rel='canonical')
    if canonical_link:
        return canonical_link['href']
    # 备用:检查页面内的重定向提示
    redirect_msg = soup.find('div', class_='redirectMsg')
    if redirect_msg:
        redirect_a = redirect_msg.find('a', href=True)
        if redirect_a:
            return f"https://en.wikipedia.org{redirect_a['href']}"
    # 无重定向则返回原URL
    return url

initial_url = "http://en.wikipedia.org/wiki/Zzzzzz"
final_url = get_wikipedia_final_url(initial_url)
print("Final URL:", final_url)

方案2:调用MediaWiki API(更高效)

直接使用维基百科的MediaWiki API查询重定向目标,无需下载整个HTML页面,速度更快、更可靠。

代码示例:

import requests

def get_wikipedia_final_url_via_api(url):
    # 从URL中提取页面标题
    title = url.split('/wiki/')[-1]
    # API请求参数
    params = {
        'action': 'query',
        'titles': title,
        'redirects': 1,
        'format': 'json'
    }
    response = requests.get('https://en.wikipedia.org/w/api.php', params=params)
    data = response.json()
    # 解析API返回的重定向信息
    if 'redirects' in data['query']:
        final_title = data['query']['redirects'][0]['to']
        return f"https://en.wikipedia.org/wiki/{final_title}"
    # 无重定向则返回原URL对应的规范链接
    pages = data['query']['pages']
    for page in pages.values():
        return f"https://en.wikipedia.org/wiki/{page['title']}"

initial_url = "http://en.wikipedia.org/wiki/Zzzzzz"
final_url = get_wikipedia_final_url_via_api(initial_url)
print("Final URL:", final_url)

测试效果

两种方案都能正确返回:https://en.wikipedia.org/wiki/Z_(joke_line)

内容的提问来源于stack exchange,提问作者Amit Sarussi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:25:26