Страницы

Поиск по вопросам

четверг, 29 ноября 2018 г.

Как использовать urlib для адреса с кириллицей

Как правильно использовать urlib.request для получения кода страницы, при условии, что в URL есть кириллица
UPD. Есть функция:
def get_html(url): return urllib.request.urlopen(url).read()
Она отдает html-код страницы по URL (да-да, кэп). Она работает ровно до того момента как в заголовке появляется кириллица и интерпретатор отдает ошибку:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-18: ordinal not in range(128)


Ответ

В рамках протокола HTTP не-ASCII символы в URI не допускаются. Например кириллица может быть введена и отображена в адресной строке браузера, но браузер переводит эту строку запроса (в виде IRI) в правильный, с точки зрения протокола HTTP URI. Соответственно для имени хоста применяется Punycode, а для остальных компонентов URL-кодирование
В вашем случае можно воспользоваться дополнительной функцией для перевода из кириллического IRI в ASCII URI
from urllib.parse import quote, urlsplit, urlunsplit
def iri_to_uri(iri): parts = urlsplit(iri) uri = urlunsplit(( parts.scheme, parts.netloc.encode('idna').decode('ascii'), quote(parts.path), quote(parts.query, '='), quote(parts.fragment), )) return uri
И вызывать вашу функцию так:
content = get_html(iri_to_uri(url))

Комментариев нет:

Отправить комментарий