BeautifulSoup und UnicodeEncodeError

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

BeautifulSoup und UnicodeEncodeError

Beitragvon Panke » Sonntag 22. Februar 2009, 12:10

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Sonntag 22. Februar 2009, 12:37

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

Beitragvon BlackJack » Sonntag 22. Februar 2009, 13:02

@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.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Beitragvon Panke » Sonntag 22. Februar 2009, 13:20

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Sonntag 22. Februar 2009, 13:21

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. ...
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Beitragvon Panke » Sonntag 22. Februar 2009, 13:38

Das Problem besteht auch, wenn ich BeautifulSoup die richtige Kodierung angebe oder den Kram vorher in Unicode umwandle.
Zuletzt geändert von Panke am Sonntag 22. Februar 2009, 17:12, insgesamt 1-mal geändert.
BlackJack

Beitragvon BlackJack » Sonntag 22. Februar 2009, 14:16

@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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 22. Februar 2009, 15:41

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Beitragvon Panke » Sonntag 22. Februar 2009, 17:11

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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder