Теперь мы знаем, как экранировать текст, вставляемый в разметку HTML и в адреса URL. Но что делать с адресами URL внутри HTML? То есть как выполнять экранирование, когда генерируется текст, вставляемый в адреса URL, в свою очередь встраиваемые в разметку HTML? В некоторых предыдущих примерах внутри тегов гиперссылок <A HREF>, используются жестко определенные адреса URL, дополненные входными параметрами. Например, файл languages2.py выводит разметку HTML, содержащую адрес URL:
<a href="getfile.py?filename=cgi-bin\languages2.py">
Поскольку строка URL здесь встроена в разметку в HTML, она должна быть экранирована, по меньшей мере, в соответствии с соглашениями HTML (например, все символы < должны быть превращены в последовательности <), а все пробелы должны быть преобразованы в знаки +. Этого можно достичь с помощью вызова cgi.escape(url) с последующим вызовом строкового метода url.replace(" ", "+"), чего в большинстве случаев должно быть достаточно.
Однако в общем случае этого мало, потому что соглашения по экранированию HTML отличны от соглашений для URL. Надежное экранирование адресов URL, встраиваемых в разметку HTML, следует осуществлять путем применения функции urllib.parse.quote_plus к строке URL или хотя бы к большинству ее компонентов, перед тем как поместить ее в текст HTML. Результат такого экранирования будет также удовлетворять соглашениям по экранированию HTML, потому что модуль urllib. parse транслирует больше символов, чем функция cgi.escape, а символ % в экранированных последовательностях внутри URL не является специальным символом HTML.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011