¿Decodificar entidades HTML en una cadena de Python?
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>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
¿Cómo puedo decodificar las entidades HTML en text
lugar "£682m"
de "£682m"
.
Pitón 3.4+
Usar html.unescape()
:
import html
print(html.unescape('£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á en
HTMLParser
- Para Python 3 está en
html.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('£682m'))
£682m
También puede utilizar la six
biblioteca de compatibilidad para simplificar la importación:
>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('£682m'))
£682m
Beautiful Soup maneja la conversión de entidades. En Beautiful Soup 3, deberá especificar el convertEntities
argumento para el BeautifulSoup
constructor (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>£682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>
Hermosa sopa 4
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>")
<html><body><p>£682m</p></body></html>
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>
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