378 Stimmen

HTML-Entitäten in Python-Strings dekodieren?

Ich analysiere gerade HTML mit Beautiful Soup 3, aber es enthält HTML-Entities, die Beautiful Soup 3 nicht automatisch für mich dekodiert:

>>> 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 zu bekommen "£682m" anstelle von "&pound;682m" .

723voto

luc Punkte 39730

Python 3.4+

Utilice html.unescape() :

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

ZU IHRER INFORMATION html.parser.HTMLParser.unescape ist veraltet, und sollte in 3.5 entfernt werden obwohl sie versehentlich drin gelassen wurde. Es wird bald aus der Sprache entfernt werden.


Python 2.6-3.3

Sie können verwenden HTMLParser.unescape() aus der Standardbibliothek:

  • Für Python 2.6-2.7 ist es 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('&pound;682m'))
£682m

72voto

Ben James Punkte 113987

Beautiful Soup behandelt die Entitätskonvertierung. In Beautiful Soup 3 müssen Sie die convertEntities Argument an die BeautifulSoup Konstruktor (siehe die Entitätsumwandlung". Abschnitt der archivierten Dokumente). In Beautiful Soup 4 werden die Entitäten automatisch entschlüsselt.

Schöne Suppe 3

>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>", 
...               convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>

Schöne Suppe 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p>£682m</p></body></html>

16voto

Corvax Punkte 664

Sie können replace_entities aus der Bibliothek w3lib.html 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

8voto

LoicUV Punkte 376

Mit Beautiful Soup 4 können Sie einen Formatierer für Ihre Ausgabe festlegen

Wenn Sie in formatter=None Beautiful Soup wird nicht bei der Ausgabe überhaupt nicht. Dies ist die schnellste Option, aber sie kann dazu führen, dass Beautiful Soup ungültiges HTML/XML erzeugt, 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>

1voto

Alex Punkte 11

Ich hatte ein ähnliches Kodierungsproblem. Ich habe die Methode normalize() verwendet. Ich erhielt einen Unicode-Fehler, wenn ich die Pandas-Methode .to_html() beim Exportieren meines Datenrahmens in eine .html-Datei in einem anderen Verzeichnis verwendete. Am Ende habe ich dies getan und es hat funktioniert...

    import unicodedata 

Das Dataframe-Objekt kann ein beliebiges sein, nennen wir es Tabelle...

    table = pd.DataFrame(data,columns=['Name','Team','OVR / POT'])
    table.index+= 1

kodieren Sie die Tabellendaten so, dass wir sie in unsere .html-Datei im Ordner templates exportieren können (dies kann ein beliebiger Ort sein :))

     #this is where the magic happens
     html_data=unicodedata.normalize('NFKD',table.to_html()).encode('ascii','ignore')

normalisierte Zeichenkette in html-Datei exportieren

    file = open("templates/home.html","w") 

    file.write(html_data) 

    file.close() 

Referenz: unicodedata Dokumentation

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X