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
Unicode String Ausgabe mit Beautifilsoup4
@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.
@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:
Ergebnis:
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'])
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
@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.
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.
@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:
dann kommt kein Error mehr, jedoch wird das 'ü' nicht korrekt angegeben.
Wo kann ich noch suchen?
Gruss, Franz
- setze mit locale cp1252 welches deutsche Umlaute hat
Code: Alles auswählen
locale.setlocale(locale.LC_ALL, 'deu_deu')
Code: Alles auswählen
loc = locale.getlocale()
Code: Alles auswählen
sys.stdout = codecs.getwriter('cp1251')(sys.stdout.buffer, 'strict')
Wo kann ich noch suchen?
Gruss, Franz
@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.
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.
@BlackJack:
- habe in den PC Systemeinstellungen 'Deutsch' hinzugefuegt
- meine python batch datei sieht so aus:
Als Resultat erscheint das 'ü' dann immer noch nicht
Gruss, Franz
- 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')
Gruss, Franz