Discord机器人调用Wikipedia API搜索返回错误页面的解决咨询
解决维基百科API搜索结果匹配错误问题
你遇到的问题核心是维基百科API的generator=search默认排序逻辑和官网搜索不一致:
- 官网搜索优先按**页面相关性(含权重、访问量、内容匹配度等)**排序
- API默认的
gsrsearch排序规则为none,即按标题匹配度+页面长度排序,导致精确名称搜索时返回了关联但非目标的页面
下面提供两种可行的解决方案:
方案一:优先精确匹配标题
先尝试直接请求对应标题的页面,存在则直接返回;不存在再执行搜索,确保精确名称能命中目标页面。
修改后的完整代码如下:
import requests import json import discord from datetime import datetime, timezone def getWiki(search): # 第一步:尝试精确匹配目标标题 exact_params = { 'action': 'query', 'format': 'json', 'formatversion': 2, 'inprop': 'url', 'prop': 'extracts|pageimages|revisions|info', 'exintro': True, 'explaintext': True, 'piprop': 'original', 'rvprop': 'timestamp', 'titles': search } exact_resp = requests.get('https://en.wikipedia.org/w/api.php', params=exact_params) exact_data = exact_resp.json() pageData = None # 遍历返回页面,排除不存在的页面(pageid为-1) for page in exact_data['query']['pages']: if page.get('pageid') != -1: pageData = page break # 精确匹配失败,执行搜索 if not pageData: search_params = { 'action': 'query', 'format': 'json', 'formatversion': 2, 'inprop': 'url', 'prop': 'extracts|pageimages|revisions|info', 'exintro': True, 'explaintext': True, 'piprop': 'original', 'rvprop': 'timestamp', 'generator': 'search', 'gsrsearch': search, 'gsrsort': 'relevance', # 采用官网逻辑的相关性排序 'gsrlimit': 1 } search_resp = requests.get('https://en.wikipedia.org/w/api.php', params=search_params) search_data = search_resp.json() pageData = search_data['query']['pages'][0] # 后续Embed构建逻辑保持不变 title = pageData['title'] summary = pageData['extract'] pageUrl = pageData.get('fullurl', '') timestamp = pageData['revisions'][0]['timestamp'] timestamp = datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%SZ") timestamp = timestamp.replace(tzinfo=timezone.utc) embed = discord.Embed(description=summary, timestamp=timestamp, colour=0xeeeeee) embed.set_author(name=title, url=pageUrl, icon_url='https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Wikipedia_logo_v3.svg/2048px-Wikipedia_logo_v3.svg.png') embed.set_footer(text='Dernière révision') wikiObject = { 'title': title, 'summary': summary, 'embed': embed } if pageData.get('original'): pageImage = pageData['original'] if pageImage.get('source'): imageUrl = pageImage['source'] embed.set_thumbnail(url=imageUrl) wikiObject['imageUrl'] = imageUrl return wikiObject
方案二:直接调整搜索排序规则
如果不需要优先精确匹配,只需修改原搜索参数,让API采用和官网一致的相关性排序即可:
修改原代码中的data字典,新增两个参数:
data = { 'action': 'query', 'format': 'json', 'formatversion': 2, 'inprop': 'url', 'prop': 'extracts|pageimages|revisions|info', 'exintro': True, 'explaintext': True, 'piprop': 'original', 'rvprop': 'timestamp', 'generator': 'search', 'gsrsearch': search, 'gsrsort': 'relevance', # 指定按相关性排序 'gsrlimit': 1 # 仅返回第一个结果 }
修改后,API返回的搜索结果排序逻辑会和维基百科官网一致,搜索“Kim Kardashian”时会优先返回目标页面。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

