2009-10-12 14 views
3

J'ai le code Python suivant à l'aide Genshi (simplifiée):Peut-on empêcher Genshi d'analyser les entités HTML?

with open(pathToHTMLFile, 'r') as f: 
    template = MarkupTemplate(f.read()) 
finalPage = template.generate().render('html', doctype = 'html') 

Le fichier HTML source contient des entités telles que ©, ™ et ®. Genshi les remplace par leur caractère UTF-8, ce qui provoque des problèmes avec le visualiseur (la sortie est utilisée comme un fichier autonome, pas une réponse à une requête web) qui voit finalement le code HTML résultant. Existe-t-il un moyen d'empêcher Genshi d'analyser ces entités? Les plus communs comme & sont passés très bien.

Répondre

9

En fait, & n'est pas traversé, il est analysé en caractère d'esperluette, puis ramené en série à & à la sortie, car cela est nécessaire pour représenter une esperluette littérale en HTML. D'autre part, le © n'est pas une évasion nécessaire, donc il peut être laissé comme son caractère littéral.

Donc non, il n'y a aucun moyen pour d'arrêter la référence d'entité étant analysée. Mais vous pouvez vous assurer que les caractères non-ASCII sont à nouveau échappé sur le chemin du retour par sérialisation à ASCII:

template.generate().render('html', doctype= 'html', encoding= 'us-ascii') 

Vous ne seront toujours pas obtenir la référence d'entité © dans votre sortie, mais vous obtiendrez le La référence de caractère © est équivalente et devrait être comprise par tout ce qui affiche le fichier final.

3

Sticking

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

dans le <head> de votre code HTML devrait provoquer des navigateurs pour rendre correctement UTF-8.

Pour clarifier, le problème principal est que le caractère © UTF-8 correspondant ne s'affiche pas correctement en HTML statique. Placer la balise meta dans le code HTML indique au navigateur comment interpréter correctement le jeu de caractères et restitue ainsi correctement les caractères UTF-8.

0

Pour éviter que de (x) caractères de balisage HTML dans Genshi:

from genshi.core import Markup 
... 
newstring = Markup(oldstring) 
... 
<now apply templates as before, but substituting newstring for oldstring>