Найти - Пользователи
Полная версия: urllib не выполняет запрос с кириллицей в url
Начало » Web » urllib не выполняет запрос с кириллицей в url
1 2
Игнат
файл в utf-8
URL = 'http://google.ru/search?as_epq=&as_oq=&as_eq=&hl=ru&tbo=1&num=100&lr=&cr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=&as_rights=&safe=images&btnG=Поиск+в+Google&start'
получаю:
    
File "/home/user/python3/as_http.py", line 222, in _exec
response = urllib.request.urlopen(request)
File "/usr/local/lib/python3.2/urllib/request.py", line 138, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/lib/python3.2/urllib/request.py", line 366, in open
response = self._open(req, data)
File "/usr/local/lib/python3.2/urllib/request.py", line 384, in _open
'_open', req)
File "/usr/local/lib/python3.2/urllib/request.py", line 344, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.2/urllib/request.py", line 1140, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/local/lib/python3.2/urllib/request.py", line 1122, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "/usr/local/lib/python3.2/http/client.py", line 964, in request
self._send_request(method, url, body, headers)
File "/usr/local/lib/python3.2/http/client.py", line 992, in _send_request
self.putrequest(method, url, **skips)
File "/usr/local/lib/python3.2/http/client.py", line 856, in putrequest
self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 157-161: ordinal not in range(128)
если убрать из урла ‘Поиск+в’ - все работает нормально
почему так и как это исправить?
Александр Кошелев
Нужно произвести эскейпинг урла, чтобы там были только ascii символы.
agalen
А как тогда, например, открыть http://президент.рф/ ? Похоже, что в urlllib кривизна - там не должно быть только ascii.
regall
agalen
А как тогда, например, открыть http://президент.рф/  ? Похоже, что в urlllib кривизна - там не должно быть только ascii.
президент.рф == xn–d1abbgf6aiiy.xn–p1ai
Внезапно!
agalen
regall
президент.рф == xn–d1abbgf6aiiy.xn–p1ai
Это преобразование и должен делать urllib внутри себя.
Если, например, дали URL в таком виде "http://президент.рф/Документы", то будь добр обработай. Браузеры ведь такое берут.
Андрей Светлов
Звучит разумно, займитесь этим.
Александр Кошелев
agalen
Это преобразование и должен делать urllib внутри себя.
Почему вы так решили? Зачем urllib знать дополнительно про кодировки, про punycode и т.п.
Низкий уровень библиотеки дает возможность авторам её клиентского кода делать всё максимально гибко в зависимости от требований. Тем более это не будет зависит от версий питона и обновленности его стандартной библиотеки.
agalen
Ну, urllib может и не должен, но было бы неполхо, если бы умел. Все-таки это не самый низкий уровень - здесь есть функции формирования и разбора url, другие вспомогательные. Низкий уровень - это когда отдал bytes, получил bytes - с кодировками возись сам.

На ISSUE TRACKER похожие вопросы обсуждались (http://bugs.python.org/issue3991), но пока вопрос открыт.
Андрей Светлов
Кажется, дело заглохло. К тому же в приведенной ссылке настораживает ее древность, отсутствие тестов и ни одного заинтересовавшегося разработчика из core development team. У двух других issues дела обстоят не намного лучше.
Как по мне - налицо явная недоработка, которая рано или поздно будет исправлена. Если этим заняться вплотную - то есть шанс починить до выхода 3.3.
DcDr
Андрей Светлов
Кажется, дело заглохло. К тому же в приведенной ссылке настораживает ее древность, отсутствие тестов и ни одного заинтересовавшегося разработчика из core development team.
Исходя из этого можно предположить, что подавляющее число питонеров - пользуются латиницей.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB