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

Python调用Wikipedia API遇重复消歧错误的非嵌套递归解决方案问询

解决Wikipedia摘要拉取时重复触发DisambiguationError的问题

看你的代码,问题首先出在except分支的写法上——你写了wikipedia.summary(e.options)[0],这相当于先尝试给整个歧义选项列表请求摘要(这肯定会报错),再去取索引0,完全搞反了逻辑!就算改成wikipedia.summary(e.options[0]),也可能遇到e.options[0]本身还是歧义条目的情况,这就是你仍收到错误的原因。

不想用嵌套/递归的话,给你几个实用的解决思路:


思路1:循环尝试歧义选项,设置尝试上限

我们可以遍历歧义选项列表,逐个尝试获取摘要,直到找到可用的结果,或者达到设定的尝试上限(避免无限循环):

import wikipedia

termlist = ['carcass','richard nixon','polar bear']
max_attempts = 3  # 限制最多尝试3个选项,可按需调整

for term in termlist:
    result = None
    try:
        # 先尝试搜索结果的第一个条目
        result = wikipedia.summary(wikipedia.search(term)[0])
    except wikipedia.DisambiguationError as e:
        # 遍历歧义选项,逐个尝试
        for option in e.options[:max_attempts]:
            try:
                result = wikipedia.summary(option)
                break  # 成功获取就跳出循环
            except wikipedia.DisambiguationError:
                continue  # 还是歧义就试下一个
    print(result if result else f"无法获取「{term}」的有效摘要")

思路2:直接使用wikipedia.page方法获取页面

wikipedia.page方法默认会处理重定向,对歧义的兼容性更好,我们可以先获取页面对象,再提取摘要:

import wikipedia

termlist = ['carcass','richard nixon','polar bear']

for term in termlist:
    result = None
    try:
        page = wikipedia.page(term, auto_suggest=True, redirect=True)
        result = page.summary
    except wikipedia.DisambiguationError as e:
        # 尝试歧义选项里的前2个条目
        for option in e.options[:2]:
            try:
                page = wikipedia.page(option)
                result = page.summary
                break
            except wikipedia.DisambiguationError:
                continue
    print(result if result else f"「{term}」未找到有效摘要")

思路3:过滤明确的歧义标记条目

很多歧义选项会带有(disambiguation)字样,我们可以先把这类条目过滤掉,再尝试剩下的选项:

import wikipedia

termlist = ['carcass','richard nixon','polar bear']

for term in termlist:
    result = None
    try:
        result = wikipedia.summary(wikipedia.search(term)[0])
    except wikipedia.DisambiguationError as e:
        # 过滤掉带歧义标记的选项
        valid_options = [opt for opt in e.options if "(disambiguation)" not in opt.lower()]
        if valid_options:
            try:
                result = wikipedia.summary(valid_options[0])
            except wikipedia.DisambiguationError:
                print(f"「{term}」的有效选项仍存在歧义")
        else:
            print(f"「{term}」没有可用的非歧义选项")
    print(result)

另外提一句,你代码里的wse(term)应该是wikipedia.search(term)的笔误吧?记得修正这个小问题~

内容的提问来源于stack exchange,提问作者Simulacra at Tanagra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:29