¿Decodificar entidades HTML en una cadena de Python?

Resuelto jkp asked hace 14 años • 7 respuestas

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

>>> 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 textlugar "£682m"de "&pound;682m".

jkp avatar Jan 18 '10 23:01 jkp
Aceptado

Pitón 3.4+

Usar html.unescape():

import html
print(html.unescape('&pound;682m'))

Para su información html.parser.HTMLParser.unescape, está en desuso y se suponía que se eliminaría en 3.5 , aunque se dejó por error. Pronto se eliminará del idioma.


Pitón 2.6-3.3

Puede utilizar HTMLParser.unescape()desde la biblioteca estándar:

  • Para Python 2.6-2.7 está enHTMLParser
  • Para Python 3 está enhtml.parser
>>> try:
...     # Python 2.6-2.7 
...     from HTMLParser import HTMLParser
... except ImportError:
...     # Python 3
...     from html.parser import HTMLParser
... 
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

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

>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m
luc avatar Jan 18 '2010 16:01 luc

Beautiful Soup maneja la conversión de entidades. En Beautiful Soup 3, deberá especificar el convertEntitiesargumento para el BeautifulSoupconstructor (consulte la sección 'Conversión de entidades' de los documentos archivados). En Beautiful Soup 4, las entidades se decodifican automáticamente.

Hermosa sopa 3

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

Hermosa sopa 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p682m</p></body></html>
Ben James avatar Jan 18 '2010 16:01 Ben James

Beautiful Soup 4 te permite configurar un formateador para tu salida

Si ingresa formatter=None, Beautiful Soup no modificará las cadenas en absoluto en la salida. Esta es la opción más rápida, pero puede hacer 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>
LoicUV avatar Jan 14 '2014 10:01 LoicUV

Tuve un problema de codificación similar. Usé el método normalize(). Recibí un error Unicode al usar el método pandas .to_html() al exportar mi marco de datos a un archivo .html en otro directorio. Terminé haciendo esto y funcionó...

    import unicodedata 

El objeto del marco de datos puede ser lo que quieras, llamémoslo tabla...

    table = pd.DataFrame(data,columns=['Name','Team','OVR / POT'])
    table.index+= 1

Codifique los datos de la tabla para que podamos exportarlos a nuestro archivo .html en la carpeta de plantillas (puede ser la ubicación que desee :))

     #this is where the magic happens
     html_data=unicodedata.normalize('NFKD',table.to_html()).encode('ascii','ignore')

exportar cadena normalizada a archivo html

    file = open("templates/home.html","w") 

    file.write(html_data) 

    file.close() 

Referencia: documentación unicodedata

Alex avatar Apr 02 '2020 21:04 Alex