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
相关产品推荐
相关产品推荐

