提问人:Thurston 提问时间:8/14/2023 更新时间:8/14/2023 访问量:48
维基百科API在关键字搜索后给出错误的页面
Wikipedia API giving wrong page after a keyword search
问:
所以我为我的 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)的页面......我能做些什么吗?
答:
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]
评论