web-dev-qa-db-fra.com

Comment décompresser des entités HTML dans une chaîne dans Python 3.1?

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".

58
VolatileRig

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')
159
unutbu

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'
14
Greg Hewgill

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 .

6
Derrick Petzold

Python 3.x a aussi html.entities

3
YOU

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.

2
Simanas

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.

1
TheJacobTaylor