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

使用pymediawiki获取搜索结果页面时如何规避DisambiguationError

解决pymediawiki获取搜索结果时的DisambiguationError问题

问题背景

使用pymediawiki库搜索"washington"这类存在歧义的词条时,调用wiki.page()会触发DisambiguationError,因为返回的搜索结果是歧义页,无法直接解析为单一页面。

解决方案

方法1:捕获歧义错误并处理

在循环获取页面时,捕获DisambiguationError,可选择跳过歧义页,或提取歧义页中的子条目(比如取第一个有效条目)。

from mediawiki import MediaWiki, DisambiguationError

wiki = MediaWiki()

# 执行搜索
search_results = wiki.search('washington', results=10)

pages = []
for result in search_results:
    try:
        page = wiki.page(result)
        pages.append(page)
    except DisambiguationError as e:
        # 方案1:跳过歧义页
        print(f"跳过歧义页: {result}")
        # 方案2:取歧义页的第一个有效子条目(可选)
        # if e.options:
        #     page = wiki.page(e.options[0])
        #     pages.append(page)

# 打印页面标题
for page in pages:
    print(page.title)

方法2:优化搜索参数,优先获取非歧义页

调用wiki.search()时,添加redirects=True参数让API自动解析重定向,同时通过namespace参数限定搜索主命名空间(排除歧义页常见的分类/讨论空间):

from mediawiki import MediaWiki

wiki = MediaWiki()

# 优化搜索参数:启用重定向,限定主命名空间(namespace=0)
search_results = wiki.search('washington', results=10, redirects=True, namespace=0)

pages = []
for result in search_results:
    try:
        page = wiki.page(result)
        pages.append(page)
    except DisambiguationError:
        print(f"跳过歧义页: {result}")

for page in pages:
    print(page.title)

方法3:直接调用MediaWiki API(替代方案)

如果pymediawiki的封装不够灵活,可直接用requests调用MediaWiki API,精准控制搜索结果:

import requests

API_URL = "https://en.wikipedia.org/w/api.php"

# 获取搜索结果的页面ID
params = {
    "action": "query",
    "list": "search",
    "srsearch": "washington",
    "srlimit": 10,
    "srnamespace": 0,  # 主命名空间
    "srredirects": "true",  # 解析重定向
    "format": "json"
}

response = requests.get(API_URL, params=params)
data = response.json()
page_ids = [item["pageid"] for item in data["query"]["search"]]

# 根据页面ID获取页面详情
params = {
    "action": "query",
    "pageids": "|".join(map(str, page_ids)),
    "prop": "info",
    "inprop": "url",
    "format": "json"
}

response = requests.get(API_URL, params=params)
page_data = response.json()

for page in page_data["query"]["pages"].values():
    print(f"标题: {page['title']}, URL: {page['fullurl']}")

说明

  • 捕获错误的方法最直接,适合快速兼容现有代码;
  • 优化搜索参数能从源头减少歧义结果的出现;
  • 直接调用API的方式灵活性最高,可根据需求定制返回字段。

内容的提问来源于stack exchange,提问作者Minura Punchihewa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:13:23