urlopen: 属性错误: 'bytes'对象没有属性'timeout'



我正在尝试从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)

然后出现错误:"bytes"对象没有属性"timeout"。

这里有两个问题,可能都源于使用包含非ASCII字符的查询组件访问url的要求。

  • 首先,将bytes实例传递给urlopen将导致意外行为,如下所述
  • 其次,URL的查询参数中不允许使用非ASCII字符,因此查询参数必须进行URL编码

因此,给定无效的url,您需要执行以下操作:

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))

最新更新