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

