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>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
Comment puis-je décoder les entités HTML dans text
pour obtenir "£682m"
au lieu de "£682m"
.
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('£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('£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('£682m'))
£682m
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>£682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>
Belle Soupe 4
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>")
<html><body><p>£682m</p></body></html>
vous pouvez utiliser replace_entities de w3lib.bibliothèque 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
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>
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