Wie kann UTF-8-codiertes HTML mit BeautifulSoup korrekt in Unicode-Strings umgewandelt werden?
Bin ich mit einem Python-Programm liest eine UTF-8-codierte web-Seite, und ich extrahiere text aus dem HTML mit BeautifulSoup.
Jedoch, wenn ich Schreibe diesen text in eine Datei (oder drucken Sie es auf der Konsole), es wird geschrieben in einer unerwarteten Codierung.
Beispielprogramm:
import urllib2
from BeautifulSoup import BeautifulSoup
# Fetch URL
url = 'http://www.voxnow.de/'
request = urllib2.Request(url)
request.add_header('Accept-Encoding', 'utf-8')
# Response has UTF-8 charset header,
# and HTML body which is UTF-8 encoded
response = urllib2.urlopen(request)
# Parse with BeautifulSoup
soup = BeautifulSoup(response)
# Print title attribute of a <div> which uses umlauts (e.g. können)
print repr(soup.find('div', id='navbutton_account')['title'])
Läuft das Ergebnis:
# u'Hier k\u0102\u015bnnen Sie sich kostenlos registrieren und /oder einloggen!'
Aber ich würde erwarten, dass ein Python-Unicode-string zu erbringen ö
im Wort können
als \xf6
:
# u'Hier k\xf6bnnen Sie sich kostenlos registrieren und /oder einloggen!'
Habe ich versucht, die übergabe der 'fromEncoding' parameter BeautifulSoup, und versuchen zu read()
und decode()
die response
Objekt, aber es macht entweder kein Unterschied, oder wirft einen Fehler aus.
Mit dem Befehl curl www.voxnow.de | hexdump -C
kann ich sehen, dass die web-Seite ist ja UTF-8 codiert ist (dh es enthält 0xc3 0xb6
) für die ö
Charakter:
20 74 69 74 6c 65 3d 22 48 69 65 72 20 6b c3 b6 | title="Hier k..|
6e 6e 65 6e 20 53 69 65 20 73 69 63 68 20 6b 6f |nnen Sie sich ko|
73 74 65 6e 6c 6f 73 20 72 65 67 69 73 74 72 69 |stenlos registri|
Bin ich über die Grenze meiner Python-Fähigkeiten, also ich bin an einem Verlust, wie zu Debuggen weiter. Irgendwelche Ratschläge?
InformationsquelleAutor der Frage Christopher Orr | 2013-11-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als justhalf Punkte oben, meine Frage ist hier im wesentlichen ein Duplikat der diese Frage.
HTML-Inhalt, der berichtet, sich selbst als UTF-8-kodiert und zum größten Teil war es, außer für ein oder zwei Schurken ungültige UTF-8-Zeichen.
Dieser scheinbar verwirrt BeautifulSoup darüber, welche Codierung verwendet wird, und wenn Sie versuchen, zuerst Dekodieren von UTF-8 bei der übergabe der Inhalte an BeautifulSoup wie
diese:
Ich würde den Fehler:
Bei einem genaueren Blick auf die Ausgabe, gab es eine Instanz der Charakter
Ü
was war falsch codiert, wie die ungültige byte-Sequenz0xe3 0x9c
statt der korrekten0xc3 0x9c
.Als die derzeit höchsten bewerteten Antwort auf, die Frage suggeriert, die ungültige UTF-8-Zeichen können entfernt werden, während der Analyse, so dass nur gültige Daten übergeben BeautifulSoup:
InformationsquelleAutor der Antwort Christopher Orr
Codierung das Ergebnis
utf-8
scheint für mich arbeiten:Ergibt:
InformationsquelleAutor der Antwort Birei