web-dev-qa-db-fra.com

Décoder les entités HTML dans la chaîne Python?

J'analyse du code HTML avec Beautiful Soup 3, mais il contient des entités HTML que Beautiful Soup 3 ne décode pas automatiquement pour moi:

>>> from BeautifulSoup import BeautifulSoup

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

>>> print text
&pound;682m

Comment décoder les entités HTML dans text pour obtenir "£682m" au lieu de "&pound;682m".

233
jkp

Python 3.4+

Utilisez html.unescape() :

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

FYI _html.parser.HTMLParser.unescape_ est obsolète et était supposé être supprimé dans la version 3.5 , bien qu’il ait été laissé par erreur. Il sera bientôt retiré de la langue.


Python 2.6-3.3

Vous pouvez utiliser HTMLParser.unescape() à partir de la bibliothèque standard:

_>>> 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
_

Vous pouvez également utiliser la bibliothèque de compatibilité six pour simplifier l'importation:

_>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m
_
460
luc

Belle soupe gère la conversion d'entité. Dans Beautiful Soup 3, vous devez spécifier l'argument convertEntities du constructeur BeautifulSoup (voir la section Conversion d'entité des documents archivés). Dans Beautiful Soup 4, les entités sont automatiquement décodées.

Belle soupe 3

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

Belle soupe 4

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

Vous pouvez utiliser replace_entities à partir de la bibliothèque 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
13
Corvax

Beautiful Soup 4 vous permet de définir un formateur pour votre sortie

Si vous passez dans formatter=None, Beautiful Soup ne modifiera pas les chaînes en sortie. C'est l'option la plus rapide, mais cela peut amener Beautiful Soup à générer du code HTML/XML non valide, comme dans les exemples suivants:

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>
2
LoicUV