我正在使用Open Trivia DB的API来生成琐事问题。
import requests, json, urllib.parse
import
url = "https://opentdb.com/api.php"
querystring = {"amount":"5","type":"multiple","encode":"url3986"}
response = requests.request("GET", url, params=querystring)
response_decoded = urllib.parse.unquote(response.text)
print(response_decoded)
response_dict = json.loads(response_decoded)
print(response_dict["results"][0])
然而,我总是遇到一个错误,错误是:
Exception has occurred: JSONDecodeError
Expecting ',' delimiter: line 1 column 347 (char 346)
我发现这个错误是因为在一些类似Who is the main character in "gamename"
的问题中,gamename周围有引号。在返回的JSON上下文中,它看起来像这样:
"question":"Who is the main character in "gamename"?",
"correct_answer":"maincharacter",
"incorrect_answers":["wrongname1","wrongname2","wrongname3"]
和游戏名周围的引号混淆了字典。
是否有一种方法可以让我只将内部引号(围绕游戏名)替换为单数引号,'
,这样就不会弄乱字典结构?
不要自己解析响应。使用requests
,它将处理引号:
import requests
resp = requests.get(
"https://opentdb.com/api.php",
params={"amount": "5", "type": "multiple", "encode": "url3986"},
)
resp.raise_for_status() # raise an Exception if the HTTP response failed
data = resp.json() # Parse JSON from the response
print(data["results"][0]) # print it
查看数据,一些内部字段显示为url编码。使用urllib.parse.unquote
:
import urllib.parse
print(urllib.parse.unquote("Entertainment%3A%20Music")) # Entertainment: Music
通过解码原始字符串,您将导致JSON格式错误。相反,您可以先json.loads
它。当您需要输出其中的任何部分时,您可以使用urllib
解码每个单独的字符串。
另一种更脆弱的方法是像
这样做response_decoded = urllib.parse.unquote(response.text.replace('"', '~')).replace('"', r'"').replace('~', '"').
如果遇到任何问题,您可以使用不同于~
的字符;我只是选择了一些不寻常的东西。