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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:16:03