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>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
¿Cómo puedo decodificar las entidades HTML en el text
para obtener "£682m"
lugar de "£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>£682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>
Sopa Hermosa 4
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>£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("£682m")
Out[203]: u''/xa3682m''
In [204]: print replace_entities("£682m")
£682m