Unicode String Ausgabe mit Beautifilsoup4

Django, Flask, Bottle, WSGI, CGI…
Antworten
franz1
User
Beiträge: 4
Registriert: Donnerstag 18. September 2014, 22:24

Hallo Python User

ich bin noch am studieren, wie man Python als site scraper benutzen kann.
Wenn ich z.B. das meta tag description [Bücher] extrahiere aus einer html5 datei, welche in utf-8 kodiert ist bekommen ich immer einen UnicodeEncodeError 'charmap codec can't encode characters'/.

Koennt ihr mir hier helfen? Ich nutze python 2.7 unter windows 7

Gruss, Franz
BlackJack

@franz1: BeautifulSoup, HTML, und UTF-8 haben damit wahrscheinlich nichts zu tun. Das Problem wird wahrscheinlich sein, dass Du Unicode-Zeichen in Bytes umwandeln willst und zwar mit einer Kodierung wo es mindestens ein Zeichen nicht gibt. Falls mit Ausgabe ``print`` gemeint ist, dann zeig doch mal was `repr()` aus dem entsprechenden Wert macht. Das ü kann es übrigens eigentlich nicht sein, es sei denn Du benutzt eine eher exotische Spracheinstellung bei der es in der ”Standardkodierung” vom Terminal tatsächlich kein ü gibt.
franz1
User
Beiträge: 4
Registriert: Donnerstag 18. September 2014, 22:24

@BlackJack: hat leider mit meiner Antwort etwas laenger gedauert.

mit repr kommt leider gar nichts an?

Ich moechte die variable 'content' auslesen
<meta content='Bücher über das Leben' name='description'/>
- mein PC hat ein russ windows 7 als OS --> sys.stdout.encoding ist cp866
- ich nutze python 3.4.1 -> wie kann ich default encoding if utf-8 aendern?

mit folgendem:

Code: Alles auswählen

print(soup.find("meta", {"name":"keywords"})['content'])
Ergebnis:
File ...cp866.py,... in encode return codecs.charmap_encode...
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-2. Character Map undefined

Mir schwant, dass die russ Kodierung eine Rolle spielen muss.

Gruss, Franz
BlackJack

@franz1: Was meinst Du mit `repr()` kommt gar nichts an?

Mit CP866 kann man keine deutschen Umlaute kodieren. Es würde andererseits nichts nützen die Daten für die Ausgabe UTF-8 zu kodieren, denn das Terminal würde dann ”Müll” anzeigen, denn es erwartet die Daten ja als CP866. Du müsstest also zusehen wie man unter Windows das Terminal dazu bringt eine Kodierung zu verwenden die deutsche Umlaute kennt. Im Idealfall eine der UTF-Kodierungen, denn dann kann man ”alles” kodieren und hat nicht das Problem das Umlaute dann gehen, irgendwelche kyrillischen Schriftzeichen dafür dann aber nicht mehr.
franz1
User
Beiträge: 4
Registriert: Donnerstag 18. September 2014, 22:24

@BlackJack
- setze mit locale cp1252 welches deutsche Umlaute hat

Code: Alles auswählen

locale.setlocale(locale.LC_ALL, 'deu_deu')
- jedoch beim pruefen mit getlocale erhalte ich cp1251 welches die russ code seite ist

Code: Alles auswählen

loc = locale.getlocale()
Wenn ich als code benutze:

Code: Alles auswählen

sys.stdout = codecs.getwriter('cp1251')(sys.stdout.buffer, 'strict')
dann kommt kein Error mehr, jedoch wird das 'ü' nicht korrekt angegeben.

Wo kann ich noch suchen?

Gruss, Franz
BlackJack

@franz1: Also bei CP1251 sollte eigentlich ein Fehler kommen. Kann es sein, dass Du Dir den Writer für CP1252 geben lässt? Da müsste das 'ü' dann als 'ь' ausgegeben werden.

Das ganze ist kein Python-Problem. Wenn Du die Locale setzt, dann muss das auch eine sein die von dem empfangenen Programm verstanden wird. Du musst das irgenwie im Terminal regeln. Also dem Programm was die Texte anzeigt. Nicht (nur) im Python-Programm das diesem Programm Bytes gibt die als Text interpretiert werden sollen.
franz1
User
Beiträge: 4
Registriert: Donnerstag 18. September 2014, 22:24

@BlackJack:
- habe in den PC Systemeinstellungen 'Deutsch' hinzugefuegt
- meine python batch datei sieht so aus:

Code: Alles auswählen

chcp cp1252
python.exe test.py
pause

Code: Alles auswählen

sys.stdout = codecs.getwriter('cp1252')(sys.stdout.buffer, 'strict')
sys.stderr = codecs.getwriter('cp1252')(sys.stderr.buffer, 'strict')
Als Resultat erscheint das 'ü' dann immer noch nicht

Gruss, Franz
Antworten