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>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
Comment décoder les entités HTML dans text
pour obtenir "£682m"
au lieu de "£682m"
.
Utilisez html.unescape()
:
_import html
print(html.unescape('£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.
Vous pouvez utiliser HTMLParser.unescape()
à partir de la bibliothèque standard:
HTMLParser
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
_
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('£682m'))
£682m
_
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.
>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>")
<html><body><p>£682m</p></body></html>
Vous pouvez utiliser replace_entities à partir de la bibliothèque 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
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>