Décoder des entités HTML dans une chaîne de caractères Python?

j'analyse du HTML avec de la belle soupe 3, mais il contient des entités HTML que la belle soupe 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 puis-je décoder les entités HTML dans text pour obtenir "£682m" au lieu de "&pound;682m" .

207
demandé sur Mark Amery 2010-01-18 19:08:52

5 réponses

Python 3.4+

HTMLParser.unescape est déprécié, et était supposé être supprimé en 3.5 , bien qu'il ait été laissé dans par erreur. Il sera retiré de la langue rapidement. Au lieu de cela, utilisez html.unescape() :

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

voir https://docs.python.org/3/library/html.html#html.unescape


Python 2.6-3.3

vous pouvez utiliser l'analyseur HTML 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

voir http://docs.python.org/2/library/htmlparser.html

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
402
répondu luc 2016-05-12 16:04:36

belles poignées de soupe conversion entité. Dans Beautiful Soup 3, vous devrez spécifier l'argument convertEntities au constructeur BeautifulSoup (voir la section "conversion D'entité" des docs archivés). Dans la belle soupe 4, les entités sont décodées automatiquement.

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>
59
répondu Ben James 2015-11-28 20:13:59

vous pouvez utiliser replace_entities de w3lib.bibliothèque 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
8
répondu Corvax 2016-08-09 08:52:54

belle soupe 4 vous permet de mettre un formateur à votre sortie

si vous passez dans formatter=None , la belle soupe ne modifiera pas les cordes à tous sur la production. C'est l'option la plus rapide, mais elle peut conduire à Belle soupe générant HTML/XML invalide, comme dans ces exemples:

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
répondu LoicUV 2014-01-14 10:03:44

ce n'est probablement pas pertinent ici. Mais pour éliminer ces entités html d'un document entier, vous pouvez faire quelque chose comme ceci: (supposons document = page et s'il vous plaît pardonnez le code négligé, mais si vous avez des idées sur la façon de le rendre meilleur, Je toutes les oreilles - Je nouveau à cela).

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
-2
répondu Neil Aggarwal 2013-10-31 11:07:16