Как правильно использовать 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))
Комментариев нет:
Отправить комментарий