Вероятно, в вашей памяти, как и в моей, не запечатлелось шестнадцатеричное значение кода ASCII для символа & (впрочем, в этом вам может помочь вызов hex(ord(c))). К счастью, в языке Python имеются инструменты автоматического экранирования адресов URL, подобные функции cgi.escape, используемой для экранирования разметки HTML. Главное, о чем нужно помнить, — это то, что код разметки HTML и строки URL имеют совершенно разный синтаксис и потому для них используются различные соглашения по экранированию. Пользователям Веб это обычно безразлично, если только им не потребуется ввести сложный адрес URL в явном виде — внутренняя реализация броузеров обычно предусматривает все, что необходимо для экранирования. Но если вы пишете сценарии, которые должны генерировать разметку HTML или адреса URL, нужно следить за экранированием символов, имеющих специальное значение.
Поскольку для HTML и URL используется разный синтаксис, в языке Python имеются два разных набора инструментов их экранирования. В стандартной библиотеке Python:
• cgi.escape экранирует текст, который должен быть вставлен в разметку HTML
• urllib.parse.quote и quote_plus экранируют текст, который должен быть вставлен в адреса URL
По совершенно необъяснимым причинам разработчики Python решили в версии 3.2 переместить функцию cgi.escape, широко используемую в этой книге, в другой модуль и переименовать ее в html. escape, объявить прежнюю функцию нерекомендуемой к использованию и несколько изменить ее поведение. И это несмотря на тот факт, что эта функция используется уже целую вечность, практически во всех CGI-сценариях на языке Python: яркий пример, когда понятия об эстетике, сложившиеся в маленькой группе лиц, наносят удар по распространенной практике в 3.X и нарушают работоспособность уже имеющегося программного кода. В будущих версиях Python вам может потребоваться использовать новую функцию html.escape — в том случае если пользователи Python не выскажут достаточно громких претензий (да, это намек!).
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011