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>&pound;682m</p>")
>>> text = soup.find("p").string

>>> print text
&pound;682m

Wie kann ich die HTML-Entitäten in text dekodieren "£682m" statt "&pound;682m" zu erhalten.

War es hilfreich?

Lösung

Python 3.4 +

Verwenden Sie html.unescape() :

import html
print(html.unescape('&pound;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:

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

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('&pound;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>&pound;682m</p>", 
...               convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>

Beautiful Soup 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;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("&pound;682m")
Out[203]: u'\xa3682m'

In [204]: print replace_entities("&pound;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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top