Seite 1 von 1

BeautifulSoup und UnicodeEncodeError

Verfasst: Sonntag 22. Februar 2009, 12:10
von Panke
Hallo,

ich wollte mit BeautifulSoup HTML einlesen und kann mir dabei folgendes Verhalten nicht erklären:

Interpretersitzung im pastebin

Warum kriege ich für

Code: Alles auswählen

>>> t
einen UnicodeEncodeError, wenn

Code: Alles auswählen

print t.__repr__()
doch funktioniert? Oder wie sage ich meinem Interpreter, dass er UTF-8 oder ISO-8859-1 nehmen soll, damit ich vernünftig im Interpreter arbeiten kann?

Verfasst: Sonntag 22. Februar 2009, 12:37
von Hyperion
Wandle die Seite doch einfach in Unicode um, z.B. mit codecs.open(). Bei der Ausgabe kannst Du dann eben das passende Encoding setzen, damit das in einer Konsole dargestellt werden kann.

Verfasst: Sonntag 22. Februar 2009, 13:02
von BlackJack
@Panke: Aus irgendeinem Grund scheint er Interpreter nicht zu wissen was das Programm am aneren Ende von seiner Standardausgabe als Kodierung erwartet. Wo drin läuft Dein Interpreter denn?

Statt ``t.__repr__()`` würde ich ``repr(t)`` empfehlen.

@Hyperion: `BeautifulSoup` liefert schon Unicode, das ist ja gerade das Problem hier.

Verfasst: Sonntag 22. Februar 2009, 13:20
von Panke
Der läuft in Konsole, dem KDE Terminal Emulator. Allerdings hab ich das selbe Problem unter virtuellen Terminals.
Woher kriegt der denn normalerweise mit, wie er sich zu verhalten hat? Umgebungsvariablen?

Verfasst: Sonntag 22. Februar 2009, 13:21
von Hyperion
BlackJack hat geschrieben: @Hyperion: `BeautifulSoup` liefert schon Unicode, das ist ja gerade das Problem hier.
Interessant. Wie erkennt BeautifullSoup denn, aus welchem Endocing es den gegebenen Strinf decosieren soll? "Rät" es da irgend wie intelligent? Ich dachte bisher so eine wirklich gute Möglichkeite gäbe es da nicht, auf das benutze Endocing zu schließen?

Edit:
OK, in der Doku steht es ja:
Doku hat geschrieben: Beautiful Soup uses a class called UnicodeDammit to detect the encodings of documents you give it and convert them to Unicode, no matter what. ...

Verfasst: Sonntag 22. Februar 2009, 13:38
von Panke
Das Problem besteht auch, wenn ich BeautifulSoup die richtige Kodierung angebe oder den Kram vorher in Unicode umwandle.

Verfasst: Sonntag 22. Februar 2009, 14:16
von BlackJack
@Panke: Das Problem ist halt, dass der Interpeter nicht festellt oder festellen kann, welche Kodierung `Konsole` erwartet. Was bei mir übrigens einwandfrei funktioniert.

Code: Alles auswählen

In [248]: import sys

In [249]: sys.stdout.encoding
Out[249]: 'UTF-8'
Bei Dir müsste da 'ascii' oder `None` heraus kommen, falls es das Attribut gibt.

Verfasst: Sonntag 22. Februar 2009, 15:41
von Leonidas
Hyperion hat geschrieben:Wie erkennt BeautifullSoup denn, aus welchem Endocing es den gegebenen Strinf decosieren soll? "Rät" es da irgend wie intelligent? Ich dachte bisher so eine wirklich gute Möglichkeite gäbe es da nicht, auf das benutze Endocing zu schließen?
Wenn man es nicht aus Headern oder Meta-Tags bekommt, dann rät man eben. So wie Chardet es auch macht.

Verfasst: Sonntag 22. Februar 2009, 17:11
von Panke
BlackJack hat geschrieben:@Panke: Das Problem ist halt, dass der Interpeter nicht festellt oder festellen kann, welche Kodierung `Konsole` erwartet. Was bei mir übrigens einwandfrei funktioniert.

Code: Alles auswählen

In [8]: sys.stdout.encoding
Out[8]: 'UTF-8'
Das können wir dann ja schon mal ausschließen.