Seite 1 von 1
Unicode String Ausgabe mit Beautifilsoup4
Verfasst: Donnerstag 18. September 2014, 22:31
von franz1
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
Re: Unicode String Ausgabe mit Beautifilsoup4
Verfasst: Donnerstag 18. September 2014, 23:21
von 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.
Re: Unicode String Ausgabe mit Beautifilsoup4
Verfasst: Montag 22. September 2014, 17:51
von franz1
@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
Re: Unicode String Ausgabe mit Beautifilsoup4
Verfasst: Montag 22. September 2014, 18:53
von 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.
Re: Unicode String Ausgabe mit Beautifilsoup4
Verfasst: Montag 22. September 2014, 20:56
von franz1
@BlackJack
- setze mit locale cp1252 welches deutsche Umlaute hat
- jedoch beim pruefen mit getlocale erhalte ich cp1251 welches die russ code seite ist
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
Re: Unicode String Ausgabe mit Beautifilsoup4
Verfasst: Montag 22. September 2014, 21:11
von 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.
Re: Unicode String Ausgabe mit Beautifilsoup4
Verfasst: Montag 22. September 2014, 21:33
von franz1
@BlackJack:
- habe in den PC Systemeinstellungen 'Deutsch' hinzugefuegt
- meine python batch datei sieht so aus:
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