维基百科API在关键字搜索后给出错误的页面

Wikipedia API giving wrong page after a keyword search

提问人:Thurston 提问时间:8/14/2023 更新时间:8/14/2023 访问量:48

问:

所以我为我的 discord 机器人制作了一个命令,以研究基于字符串的维基百科页面:

import requests
import json
import discord
from datetime import datetime, timezone

def getWiki(search):
    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
    }
    response = requests.get('https://en.wikipedia.org/w/api.php', params=data)
    jsonData = json.loads(response.text)

    pageData = jsonData['query']['pages'][0]
    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

然而,结果非常奇怪。例如,当搜索金·卡戴珊(Kim Kardashian)(这是她页面的确切名称)时,它会给我罗伯特·卡戴珊(Robert Kardashian)的页面......我能做些什么吗?

你可以在网站上看到她是最好的结果:enter image description here

python 维基百科 wikipedia-api

评论

1赞 Abhijit Sarkar 8/14/2023
你有没有看过手动搜索“金·卡戴珊”时发出的网络电话?这些是否与您从机器人发出的呼叫匹配?

答:

0赞 Nicolas 8/14/2023 #1

谢谢@AbhijitSarkar,通过查看网络调用,我发现它正在使用 https://en.wikipedia.org/w/rest.php/v1/search/title?q=Kim+Kardashian&limit=10 来搜索结果。然后,我以这种方式编辑了我的代码:

response = requests.get(f'https://en.wikipedia.org/w/rest.php/v1/search/title?q={search}&limit=1')
jsonData = json.loads(response.text)
searchResult = jsonData['pages'][0]['title']

data = {
    'action': 'query',
    'format': 'json',
    'formatversion': 2,
    'inprop': 'url',
    'prop': 'extracts|pageimages|revisions|info',
    'exintro': True,
    'explaintext': True,
    'piprop': 'original',
    'rvprop': 'timestamp',
    'titles': searchResult
}

response = requests.get('https://en.wikipedia.org/w/api.php', params=data)
jsonData = json.loads(response.text)

我首先找到第一个请求的标题,然后使用按标题进行查询,这次是在数据对象中使用。searchResult'titles': searchResult

1赞 Tgr 8/14/2023 #2

jsonData['query']['pages']按页面 ID 排序,而不是按搜索相关性排序。这是使用生成器的限制。您需要使用该属性来查找实际的第一个搜索结果:index

results = jsonData['query']['pages']
results.sort(key = lambda x: x.get('index'))
pageData = results[0]