2009-03-19 7 views
12

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

cgi.escape() va échapper aux chaînes (mal), mais il n'y a pas unescape().

Répondre

37

HTMLParser a la fonctionnalité dans la bibliothèque standard. Il est, malheureusement, non documentée:

(python2 Docs)

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

(Python 3 Docs)

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

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

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

+1

+1 Je ne connaissais pas cette fonction de HTMLParser – vartec

+2

Voici une fonction documentée de la bibliothèque standard qui convertira le code HTML échappé en une chaîne normale: http://docs.python.org/library/xml.sax. Utils.html # xml.sax.saxutils.unescape –

+0

En Python 3.4, il était [documenté] (https://docs.python.org/3/library/html.html#html.unescape). – 9000

1

Utilisez le module htmlentitydefs. Ce mon ancien code, cela a fonctionné, mais je suis sûr qu'il est plus propre et plus pythonique façon de le faire:

e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items()) 
12

J'ai oublié de tagger au début, mais je l'utilise BeautifulSoup.

En fouillant dans la documentation, je trouve:

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

-t-il exactement comme je l'espérais.

+4

Cela ne fonctionne que pour les versions de BeautifulSoup pré-BS4. Si vous utilisez BS4, vous devez utiliser un formateur: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#output-formatters – kronion

+2

cela ne fonctionne pas pour & En fait, si une chaîne contient '&' , BeautifulSoup le convertit en &, ce qui est le contraire de ce que j'espérais. –