Decode HTML-Entitäten in Python-String?
-
21-09-2019 - |
Frage
Ich bin Parsen einiger HTML mit Schöner Suppe 3, aber es enthält HTML-Entitäten, die drei schöne Suppe nicht automatisch dekodieren für mich:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<p>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
Wie kann ich die HTML-Entitäten in text
dekodieren "£682m"
statt "£682m"
zu erhalten.
Lösung
Python 3.4 +
Verwenden Sie html.unescape()
:
import html
print(html.unescape('£682m'))
FYI html.parser.HTMLParser.unescape
ist veraltet und sollte werden in 3,5 entfernt, obwohl es in versehentlich verlassen wurde. Es wird aus der Sprache bald entfernt werden.
Python 2,6-3,3
Sie können HTMLParser.unescape()
aus der Standardbibliothek verwenden:
- Für Python 2,6-2,7 es ist in
HTMLParser
- Für Python 3 ist es in
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
Sie können auch die six
Kompatibilitätsbibliothek um den Import zu vereinfachen:
>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('£682m'))
£682m
Andere Tipps
Schöne Suppe Griff Entity-Umwandlung. In Schöner Suppe 3, werden Sie das convertEntities
Argument für den Konstruktor BeautifulSoup
angeben müssen (siehe Abschnitt der archivierten Dokumente "Entity-Umwandlung). In Schöner Suppe 4, erhalten Entitäten automatisch dekodiert.
Beautiful Soup 3
>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>
Beautiful Soup 4
>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>£682m</p>")
<html><body><p>£682m</p></body></html>
Sie können replace_entities von w3lib.html Bibliothek verwenden
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 können Sie einen Formatierer auf Ihren Ausgang gesetzt
Wenn Sie in
formatter=None
passieren, schöne Suppe wird nicht Strings ändern überhaupt auf die Produktion. Dies ist die schnellste Option, aber es kann führen zu Schöne Suppe auf ungültigen HTML / XML, wie in diesen Beispielen:
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>
Dies ist wahrscheinlich ist nicht hier relevant. Aber diese HTML-Entities aus einem gesamten Dokument zu beseitigen, können Sie etwas tun, wie folgt: (Angenommen Dokument = Seite und bitte den schlampigen Code vergeben, aber wenn Sie Ideen, wie es besser zu machen, Im alle Ohren - Im neu dies).
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