J'ai regardé tout autour et n'ai trouvé que des solutions pour python 2.6 et versions antérieures, RIEN sur la façon de le faire dans python 3.X. (j'ai seulement accès à la boîte Win7.)
JE DOIS pouvoir le faire en 3.1 et de préférence sans bibliothèques externes. Actuellement, j'ai httplib2 installé et j'ai accès à la boucle d'invite de commandes (c'est ainsi que j'obtiens le code source des pages). Malheureusement, curl ne décode pas les entités html, pour autant que je sache, je n'ai pas trouvé de commande pour le décoder dans la documentation.
OUI, j'ai essayé de faire fonctionner Beautiful Soup, BEAUCOUP DE FOIS sans succès en 3.X. Si vous pouviez fournir des instructions EXPLICITES sur la façon de le faire fonctionner dans python 3 dans l'environnement MS Windows, je vous serais très reconnaissant.
Donc, pour être clair, je dois tourner des chaînes comme ceci: Suzy & John
dans une chaîne comme celle-ci: "Suzy & John".
Vous pouvez utiliser la fonction html.unescape :
En Python3.4 + (merci à J.F. Sebastian pour la mise à jour):
import html
html.unescape('Suzy & John')
# 'Suzy & John'
html.unescape('"')
# '"'
Dans Python3.3 ou plus ancien:
import html.parser
html.parser.HTMLParser().unescape('Suzy & John')
Dans Python2 :
import HTMLParser
HTMLParser.HTMLParser().unescape('Suzy & John')
Vous pouvez utiliser xml.sax.saxutils.unescape
à cet effet. Ce module est inclus dans la bibliothèque standard Python, et est portable entre Python 2.x et Python 3.x .
>>> import xml.sax.saxutils as saxutils
>>> saxutils.unescape("Suzy & John")
'Suzy & John'
Apparemment, je n'ai pas une réputation assez élevée pour faire autre chose que publier ceci. La réponse d'unutbu n'échappe pas aux citations. La seule chose que j'ai trouvée qui a fait était cette fonction:
import re
from htmlentitydefs import name2codepoint as n2cp
def decodeHtmlentities(string):
def substitute_entity(match):
ent = match.group(2)
if match.group(1) == "#":
return unichr(int(ent))
else:
cp = n2cp.get(ent)
if cp:
return unichr(cp)
else:
return match.group()
entity_re = re.compile("&(#?)(\d{1,5}|\w{1,8});")
return entity_re.subn(substitute_entity, string)[0]
Ce que j'ai obtenu de cette page .
Python 3.x a aussi html.entities
Dans mon cas, j'ai une chaîne html échappée dans la fonction d'échappement as3. Après une heure de recherche sur Google, je n'ai rien trouvé d'utile, alors j'ai écrit cette fonction récurrente pour répondre à mes besoins. C'est ici,
def unescape(string):
index = string.find("%")
if index == -1:
return string
else:
#if it is escaped unicode character do different decoding
if string[index+1:index+2] == 'u':
replace_with = ("\\"+string[index+1:index+6]).decode('unicode_escape')
string = string.replace(string[index:index+6],replace_with)
else:
replace_with = string[index+1:index+3].decode('hex')
string = string.replace(string[index:index+3],replace_with)
return unescape(string)
Edit-1 Ajout d'une fonctionnalité pour gérer les caractères unicode.
Je ne sais pas s'il s'agit d'une bibliothèque intégrée ou non, mais elle ressemble à ce dont vous avez besoin et prend en charge la 3.1.
De: http://docs.python.org/3.1/library/xml.sax.utils.html?highlight=html%20unescape
xml.sax.saxutils.unescape (data, entity = {}) Décompressez '&', '<' et '>' dans une chaîne de données.