urlopen:属性错误:“字节”对象没有属性“超时”

问题描述 投票:0回答:1

我正在尝试从 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' object has no attribute 'timeout' 。

python character-encoding urlencode non-ascii-characters
1个回答
0
投票

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

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

因此,鉴于无效的网址,您需要执行以下操作:

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))
© www.soinside.com 2019 - 2024. All rights reserved.