Можно ли запретить Genshi анализировать объекты HTML?
Вопрос
У меня есть следующий код Python, использующий Genshi (упрощенный):
with open(pathToHTMLFile, 'r') as f:
template = MarkupTemplate(f.read())
finalPage = template.generate().render('html', doctype = 'html')
Исходный HTML-файл содержит такие объекты, как ©
, ™
и ®
.Genshi заменяет их символами UTF-8, что вызывает проблемы со средством просмотра (выходные данные используются как отдельный файл, а не как ответ на веб-запрос), который в конечном итоге видит результирующий HTML.Есть ли способ запретить Genshi анализировать эти объекты?Более распространенные из них, такие как &
проходят нормально.
Решение
На самом деле &
не передается, он анализируется в символ амперсанда, а затем сериализуется обратно в &
на выходе, потому что это необходимо для представления буквального амперсанда в HTML. ©
, с другой стороны, не является обязательным escape-символом, поэтому его можно оставить в качестве его буквального символа.
Так что нет, нет возможности останавливаться анализируемая ссылка на объект.Но вы можете гарантировать, что символы, отличные от ASCII, будут повторно экранированы на обратном пути путем сериализации в простой ASCII:
template.generate().render('html', doctype= 'html', encoding= 'us-ascii')
Вы все равно не получите ссылку на объект ©
в вашем выводе, но вы получите ссылку на символ ©
что эквивалентно и, надеюсь, должно быть понято тем, что отображает окончательный файл.
Другие советы
Прилипание
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
в <head>
вашего HTML-кода должен заставить браузеры правильно отображать UTF-8.
Чтобы уточнить, основная проблема заключается в том, что соответствующий символ © UTF-8 неправильно отображается в статическом HTML.Размещение метатега в HTML сообщает браузеру, как правильно интерпретировать набор символов и, таким образом, правильно отображать символы UTF-8.
Чтобы предотвратить экранирование символов разметки (x)html в Genshi:
from genshi.core import Markup
...
newstring = Markup(oldstring)
...
<now apply templates as before, but substituting newstring for oldstring>