python html html-entities

python encode html



¿Decodificar las entidades HTML en la cadena Python? (5)

Python 3.4+

HTMLParser.unescape está en desuso y se suponía que se eliminaría en 3.5 , aunque se dejó por error. Se eliminará del idioma pronto. En su lugar, use html.unescape() :

import html print(html.unescape(''£682m''))

vea https://docs.python.org/3/library/html.html#html.unescape

Python 2.6-3.3

Puede usar el analizador HTML de la biblioteca estándar:

>>> try: ... # Python 2.6-2.7 ... from HTMLParser import HTMLParser ... except ImportError: ... # Python 3 ... from html.parser import HTMLParser ... >>> h = HTMLParser() >>> print(h.unescape(''£682m'')) £682m

Consulte http://docs.python.org/2/library/htmlparser.html

También puede utilizar la biblioteca de six compatibilidad para simplificar la importación:

>>> from six.moves.html_parser import HTMLParser >>> h = HTMLParser() >>> print(h.unescape(''£682m'')) £682m

Estoy analizando algo de HTML con Beautiful Soup 3, pero contiene entidades HTML que Beautiful Soup 3 no se decodifica automáticamente para mí:

>>> from BeautifulSoup import BeautifulSoup >>> soup = BeautifulSoup("<p>&pound;682m</p>") >>> text = soup.find("p").string >>> print text &pound;682m

¿Cómo puedo decodificar las entidades HTML en el text para obtener "£682m" lugar de "&pound;682m" ?


Beautiful Soup 4 te permite configurar un formateador para tu salida

Si pasa en formatter=None , Beautiful Soup no modificará las cadenas en la salida. Esta es la opción más rápida, pero puede llevar a que Beautiful Soup genere HTML / XML no válido, como en estos ejemplos:

print(soup.prettify(formatter=None)) # <html> # <body> # <p> # Il a dit <<Sacré bleu!>> # </p> # </body> # </html> link_soup = BeautifulSoup(''<a href="http://example.com/?foo=val1&bar=val2">A link</a>'') print(link_soup.a.encode(formatter=None)) # <a href="http://example.com/?foo=val1&bar=val2">A link</a>


Esto probablemente no es relevante aquí. Pero para eliminar estos entes html de un documento completo, puede hacer algo como esto: (Supongamos que document = page y perdone el código descuidado, pero si tiene ideas sobre cómo mejorarlo, no tengo nada que hacer. Soy nuevo para esta).

import re import HTMLParser regexp = "&.+?;" list_of_html = re.findall(regexp, page) #finds all html entites in page for e in list_of_html: h = HTMLParser.HTMLParser() unescaped = h.unescape(e) #finds the unescaped value of the html entity page = page.replace(e, unescaped) #replaces html entity with unescaped value


Hermosa sopa se encarga de la conversión de la entidad. En Beautiful Soup 3, deberá especificar el argumento convertEntities para el constructor BeautifulSoup (consulte la sección ''Conversión de entidad'' de los documentos archivados). En Beautiful Soup 4, las entidades se decodifican automáticamente.

Sopa Hermosa 3

>>> from BeautifulSoup import BeautifulSoup >>> BeautifulSoup("<p>&pound;682m</p>", ... convertEntities=BeautifulSoup.HTML_ENTITIES) <p>£682m</p>

Sopa Hermosa 4

>>> from bs4 import BeautifulSoup >>> BeautifulSoup("<p>&pound;682m</p>") <html><body><p>£682m</p></body></html>


Puede usar replace_entities de la biblioteca w3lib.html

In [202]: from w3lib.html import replace_entities In [203]: replace_entities("&pound;682m") Out[203]: u''/xa3682m'' In [204]: print replace_entities("&pound;682m") £682m