87 votes

Convertir les entités HTML en Unicode et vice versa

Comment convertir les entités HTML en Unicode et vice versa en Python ?

17 votes

@Jarret Hardie : En fait, le show-and-tell est parfaitement bien sur SO. Dès la première entrée de la FAQ ( stackoverflow.com/faq ) "Il est également parfaitement acceptable de poser et de répondre à votre propre question de programmation". Cependant, il est également encouragé de rechercher les doublons.

13 votes

Je publie des questions auxquelles j'ai répondu moi-même dans le passé pour le bénéfice d'autres utilisateurs qui cherchent des réponses similaires.

0 votes

Peut également se faire sans bibliothèques externes. Voir stackoverflow.com/questions/663058/html-entity-codes-to-text/

113voto

Isaac Points 4557

Quant au "vice versa" (dont j'avais besoin moi-même, ce qui m'a amené à trouver cette question, qui ne m'a pas aidé, et par la suite un autre site qui avait la réponse ) :

u'some string'.encode('ascii', 'xmlcharrefreplace')

retournera une chaîne de caractères en clair, les caractères non ascii étant transformés en entités XML (HTML).

1 votes

J'avais oublié xmlcharrefreplace et ceci m'a été très utile. Chaque fois que j'ai besoin de stocker en toute sécurité des caractères codés ou non ascii dans mysql, je constate que je dois utiliser cette méthode.

1 votes

Cela ne fonctionne pas avec un littéral de chaîne de caractères contenant le caractère unicode U+2019 Équivalent de l'entité HTML ' N'est-ce pas ce que la question demandait (cette réponse convertit l'ascii qui est un sous-ensemble de l'unicode) ? text.decode('utf-8').encode('ascii', 'xmlcharrefreplace')

1 votes

@MikeS Cela fonctionne sans problème ; >>> u'\u2019'.encode('utf-8').decode('utf-8').encode('ascii', 'xmlcharrefreplace') donne '’'

33voto

hekevintran Points 3000

Vous devez avoir BelleSoupe .

from BeautifulSoup import BeautifulStoneSoup
import cgi

def HTMLEntitiesToUnicode(text):
    """Converts HTML entities to unicode.  For example '&' becomes '&'."""
    text = unicode(BeautifulStoneSoup(text, convertEntities=BeautifulStoneSoup.ALL_ENTITIES))
    return text

def unicodeToHTMLEntities(text):
    """Converts unicode to HTML entities.  For example '&' becomes '&'."""
    text = cgi.escape(text).encode('ascii', 'xmlcharrefreplace')
    return text

text = "&, ®, <, >, ¢, £, ¥, €, §, ©"

uni = HTMLEntitiesToUnicode(text)
htmlent = unicodeToHTMLEntities(uni)

print uni
print htmlent
# &, ®, <, >, ¢, £, ¥, €, §, ©
# &amp;, &#174;, &lt;, &gt;, &#162;, &#163;, &#165;, &#8364;, &#167;, &#169;

2 votes

L'api BeautifulSoup a changé. Veuillez consulter la version la plus récente doc .

0 votes

@hekevintran : Est-il possible d'imprimer '¢, £, ¥, €, §, ©' au lieu de '¢, £, ¥, €, §, ©'. Une idée ?

9 votes

Cette réponse a désespérément besoin d'une mise à jour de Python3.

22voto

bahmait Points 359

Mise à jour pour Python 2.7 et BeautifulSoup4

Unescape -- Unicode HTML vers unicode avec htmlparser (librairie standard de Python 2.7) :

>>> escaped = u'Monsieur le Cur&eacute; of the &laquo;Notre-Dame-de-Gr&acirc;ce&raquo; neighborhood'
>>> from HTMLParser import HTMLParser
>>> htmlparser = HTMLParser()
>>> unescaped = htmlparser.unescape(escaped)
>>> unescaped
u'Monsieur le Cur\xe9 of the \xabNotre-Dame-de-Gr\xe2ce\xbb neighborhood'
>>> print unescaped
Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood

Unescape -- Unicode HTML vers unicode avec bs4 (BelleSoupe4) :

>>> html = '''<p>Monsieur le Cur&eacute; of the &laquo;Notre-Dame-de-Gr&acirc;ce&raquo; neighborhood</p>'''
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(html)
>>> soup.text
u'Monsieur le Cur\xe9 of the \xabNotre-Dame-de-Gr\xe2ce\xbb neighborhood'
>>> print soup.text
Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood

Escape -- Unicode vers unicode HTML avec bs4 (BelleSoupe4) :

>>> unescaped = u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood'
>>> from bs4.dammit import EntitySubstitution
>>> escaper = EntitySubstitution()
>>> escaped = escaper.substitute_html(unescaped)
>>> escaped
u'Monsieur le Cur&eacute; of the &laquo;Notre-Dame-de-Gr&acirc;ce&raquo; neighborhood'

18voto

Pedro Lobito Points 6794

Para python3 utiliser html.unescape() :

import html
s = "&amp;"
decoded = html.unescape(s)
# &

17voto

irdb Points 11

En hekevintran La réponse suggère que vous pouvez utiliser cgi.escape(s) pour l'encodage des piqûres, mais notez que l'encodage des guillemets est faux par défaut dans cette fonction et qu'il peut être judicieux de passer l'attribut quote=True à côté de votre chaîne. Mais même en passant quote=True la fonction n'échappera pas aux guillemets simples ( "'" ) (En raison de ces problèmes, la fonction a été supprimée. déprécié depuis la version 3.2)

Il a été suggéré d'utiliser html.escape(s) au lieu de cgi.escape(s) . (Nouveau dans la version 3.2)

Aussi html.unescape(s) a été introduit dans la version 3.4 .

Ainsi, dans python 3.4, vous pouvez :

  • Utilisez html.escape(text).encode('ascii', 'xmlcharrefreplace').decode() pour convertir les caractères spéciaux en entités HTML.
  • Et html.unescape(text) pour reconvertir les entités HTML en représentations en texte brut.

1 votes

En Python 2.7 vous pouvez utiliser HTMLParser.unescape(text)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X