Страницы

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

среда, 25 декабря 2019 г.

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

#python #python_3x #urllib


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

    


Ответы

Ответ 1



В рамках протокола 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))

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

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