Encode Hilfe bei Umlauten

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.
Antworten
bst2k
User
Beiträge: 10
Registriert: Mittwoch 6. Februar 2019, 18:50

Hallo zusammen,

ich bin jetzt seit einigen Stunden am verzweifeln.. Es geht um folgenden Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup
import datetime
import os, sys

....

    for div in divs:
        l= div.find("div", attrs={"class" : location"}).text
        s = div.find("div", attrs={"id" : "street"}).text
        c = div.find("div", attrs={"id" : "city"}).text


        f.write(str(l) + ";" + str(s) + ";" + str(c))
        
....

Dieser Code funktioniert auf meinem Lokalen Windows PC ohne Probleme und auch die Darstellung der Umlaute funktioniert.

Wenn ich den Code auf meinem Raspberry laufen lasse, bekomme ich den Fehler:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
Wenn ich den Code jetzt wie folgt anpasse ...

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import requests
from bs4 import BeautifulSoup
import datetime
import os, sys

....

    for div in divs:
        l= div.find("div", attrs={"class" : location"}).text
        s = div.find("div", attrs={"id" : "street"}).text
        c = div.find("div", attrs={"id" : "city"}).text
        
        local= l.encode('ascii', 'replace')
        street = s.encode('ascii', 'replace')
        city = c.encode('ascii', 'replace')


        f.write(str(local) + ";" + str(street ) + ";" + str(city ))
        
....
.. läuft zwar alles wunderbar durch, aber die Umlaute werden mit einem ? ersetzt. Mir ist klar, dass dafür replace verantwortlich ist, aber ohne stürzt der Code auch wieder ab. Ersetze ich ASCII durch UTF8 beim encoden, bekomme ich wieder den Fehler
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
Kann mir hier bitte jemand helfen?

Danke & Gruß
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Die entscheidenden Stellen fehlen, nämlich die, wo f (übrigens ein sehr schlechter Variablenname, weil einbuchstabige gar nichts aussagen) definiert wird, bzw. die Information, dass Du unter Windows Python3 benutzt und unter Raspian Python2.

Beim Öffnen der Datei gibst Du am besten immer ein encoding an, für Python2 io.open.
Wenn Du csv-Dateien schreiben willst, benutze unicodecsv. Beachte den Fall, dass ; in einem der Felder vorkommen könnte.
bst2k
User
Beiträge: 10
Registriert: Mittwoch 6. Februar 2019, 18:50

Hallo Sirius,

Danke für deine schnelle Antwort.

In dem Code öffne ich die CSv wie folgt:

Code: Alles auswählen

filename = 'Locations.csv'
f = open(filename, "a")
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Und die Lösungen habe ich auch schon geschrieben.
Antworten