问题描述
我正在尝试从包含波兰语字母字符的API打开json文件。我曾尝试将url编码为utf-8,但仍然会弹出各种问题。我包括了我编写的代码和出现的错误。
import urllib.request as request
import json
url='https://api.um.warszawa.pl/api/action/dbtimetable_get?id=myapiID&busstopId=wartość&busstopNr=wartość&line=wartość&apikey=wartość'
url=url.encode('utf-8')
with request.urlopen(url) as response:
source = response.read()
data = json.loads(source)
然后出现错误:“字节”对象没有属性“超时”。
解决方法
这里有两个问题,可能都是由于要求使用包含非ASCII字符的查询组件访问url所致。
- 首先,将
bytes
实例传递给urlopen
会导致意外行为,如here 所述
- 第二,URL的查询参数中不允许使用非ASCII字符,因此必须对查询参数进行数字编码。
因此,鉴于网址无效,您需要执行以下操作:
import json
from urllib import parse
from urllib import request
parts - parse.urlsplit(url)
query_dict = parse.parse_qs(parts.query)
encoded_query = parse.urlencode(query_dict)
fixed_url = parse.urlunsplit((parts.scheme,parts.netloc,parts.path,encoded_query,parts.fragment))
response = request.urlopen(fixed_url)
print(json.load(response))