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

Schreibe einen Kommentar