Question

    

Cette question a déjà une réponse ici:

         

Est-ce que quelqu'un connaît un moyen simple en Python de convertir une chaîne avec des codes d'entité HTML (par exemple &lt; &amp;) en chaîne normale (par exemple < & amp;)?

cgi.escape() échappera les chaînes (mal), mais il n'y a pas de unescape().

Était-ce utile?

La solution

HTMLParser possède les fonctionnalités de la bibliothèque standard. Il est malheureusement sans papiers:

( Docs de Python2

>>> import HTMLParser
>>> h= HTMLParser.HTMLParser()
>>> h.unescape('alpha &lt; &beta;')
u'alpha < \u03b2'

( Documents de Python 3)

>>> import html.parser
>>> h = html.parser.HTMLParser()
>>> h.unescape('alpha &lt; &beta;')
'alpha < \u03b2'

htmlentitydefs est documenté, mais vous oblige à faire beaucoup de le travail vous-même.

Si vous n'avez besoin que des entités prédéfinies XML (lt, gt, amp, quot, apos), vous pouvez utiliser minidom pour les analyser. Si vous n'avez besoin que des entités prédéfinies et de l'absence de références de caractères numériques, vous pouvez simplement utiliser une ancienne chaîne simple pour remplacer la vitesse.

Autres conseils

J'ai oublié de le marquer au début, mais j'utilise BeautifulSoup.

En fouillant dans la documentation, j'ai trouvé:

soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES)

le fait exactement comme je l'espérais.

Rien dans la bibliothèque stdlib de Python pour découpler le code HTML, mais il existe un court script que vous pouvez adapter à vos besoins à l'adresse http://www.w3.org/QA/2008/04/unescape-html-entities-python .html.

Utilisez le module htmlentitydefs . C'est mon ancien code, cela a fonctionné, mais je suis sûr qu'il existe un moyen plus propre et plus pythonique de le faire:

e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top