Проблема кодирования Python.Невозможно открыть URL, содержащий символы кириллицы - PullRequest
2 голосов
/ 04 августа 2011

У меня есть поисковый URL "mysite.com/\u0422\u0435\u043A\u0441\u0442 \ u043D \ u0430 \ u038A \ u0438 \ u0440 \ u043B \ u0438 \ u0446 \ u0430" ("mysite.com/Текст на кирилица ").Я хочу открыть этот URL с помощью browser.open (ссылка), где браузер

$CHandler = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
browser = urllib2.build_opener(CHandler)
user_agent = '  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17'
browser.addheaders = [('User-agent', user_agent )]
urllib2.install_opener(browser)

И я получаю сообщение об ошибке: «UnicodeEncodeError: кодек« ascii »не может кодировать символы в позиции 12-17: ординалне в диапазоне (128) "Я получаю этот URL от JSON.Ура! * * 1004

1 Ответ

4 голосов
/ 04 августа 2011

mysite.com/Текст на кирилица не является URL-адресом:

  • , поскольку в нем пропущена схема http:// (или другая);
  • содержит пробелы, которые недопустимы;
  • , потому что URI не может содержать символы не ASCII.Только IRI могут, и urllib2 их не поддерживает.

Так что вам нужно будет исправить разрывы,% -кодирование вне символов полосы (например, пробел ->%20), добавьте схему, если она отсутствует, и затем преобразуйте IRI в URI.Чтобы выполнить это преобразование, вам необходимо кодировать часть адреса узла с помощью алгоритма IDN (Python: s.encode('idna')), а затем кодировать любые символы, не входящие в ASCII, в других частях адреса с использованием UTF-8.затем% -encoding.

В итоге вы хотите получить:

http://mysite.com/%D0%A2%D0%B5%D0%BA%D1%81%D1%82%20%D0%BD%D0%B0%20%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%B8%D1%86%D0%B0

, который является действительным URI, принятым urllib2, но также отображается как http://mysite.com/Текст на кирилица в браузереадресная строка, когда вы следуете за ней.

Существует множество функций, которые реализуют IRI-to-URI (большинство веб-фреймворков Python имеют что-то подобное, например).Если вы хотите полностью справиться с исправлением и нормализацией подозрительных входящих URL-адресов, есть также this .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...