UnicodeEncodeError с urlopen(..net/cé..)

Я пытаюсь открыть URL-адрес, содержащий символ Юникода (é).
Когда я пишу его непосредственно в функции, я получаю следующую ошибку:

from urllib.request import urlopen
uClient = urlopen("https://www.mypage.net/céline")

>>> UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 14: ordinal not in range(128)

Когда я пишу это так, это работает:

from urllib.request import urlopen
uClient = urlopen("https://www.mypage.net/cr%C3%A9line")

Но это должно работать автоматически, поэтому с encode вывод будет таким:

без: https://www.mypage.net/c.

utf-8: b'https://www.mypage.net/c\xc3\xa9line

latin-1: b'https://www.mypage.net/c\xe9line

ascii: b'https://www.mypage.net/cline

Итак, вопрос в том, как преобразовать строку "https://www.mypage.net/c%C3%A9line" во что-то, что может использовать функция urlopen?

Я работаю с ATOM-Editor и Python 3.6.5 (v3.6.5:f59c0932b4, 28 марта 2018 г., 17:00:18) [MSC v.1900 64 бит (AMD64)] на win32

Спасибо!


person n0meX    schedule 26.08.2018    source источник


Ответы (1)


URL-адрес запроса должен быть правильно экранирован для работы с urlopen.

В вашем примере это дает вам правильно закодированный URL:

protohost = 'https://example.com/'
path = 'céline'
urllib.request.urlopen(f'{protohost}{urllib.request.quote(path)}')

Обратите внимание, что закодированная часть выглядит так:

>>> f'{protohost}{urllib.request.quote(path)}'
'https://example.comc%C3%A9line'
person Anthony Sottile    schedule 26.08.2018