String Encoding

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
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Guten Abend zusammen,

(ganz erlich) ich kann dieses Thema nicht ausstehen, weil es mir in regelmäßigen Abständen in den verschiedesten Programmiersprachen den Nerv raubt :)

Ziel: Auslesen einer Webseite, die (laut Firefox) UTF-8 Inhalte zurück schickt. Das Python-File ist ISO Codiert (wenn man das File-Encodiung auf "UTF8" stellt geht es natürlich, aber dann habe ich die Probleme an anderer Stelle :) ). Eigentlich dachte ich das man das ganze mit einfachem encoding und decoding auf die Reihe bekommen, aber irgendwie stelle ich mich da scheinbar etwas ungeschickt an:

Code: Alles auswählen

# -*- coding: ISO-8859-1 -*-

import urllib
import re

htmlFile=urllib.urlopen("http://www.kuechengoetter.de/rezepte/verschiedenes/Nasi-Goreng-mit-Weisskohl-und-Moehren-18016.html")
htmlString=""
for line in htmlFile:
    htmlString+=line
        
title=re.findall("<title>(.*?)</title>",htmlString)[0].split(" : ")[0]

print title 
#>>Nasi Goreng mit Weißkohl und Möhren
title = title.encode("utf8").decode("iso-8859-1")
print title
#>> Nasi Goreng mit Weißkohl und Möhren
BlackJack

@da.dom: Du magst vielleicht noch einmal über en- und dekodieren nachdenken. Also was man enkodieren kann und sollte und was man dekodieren kann und sollte und was da jeweils als Typ rauskommt.

Wenn Du alles lesen willst, wäre ein `read()` effizienter als zeilenweise zu lesen und das so ineffizient wieder zusammenzusetzen.

Warum `findall()` wenn Du eh nur das erste Vorkommen suchst!?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Vielleicht hilft dir schon folgendes:

Von Unicode woanders (UTF-8, ISO88-59-1, ...) hin: encode
Von woanders nach Unicode: decode
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich empfehle Leonidas Unicode Folien um sich mit Unicode in Python auseinander zusetzen.
Was du da machst, zeigt dass du das Konzept noch nicht verstanden hast (zugegeben: es ist knifflig).
problembär

Also, ich finde dieses Tutorial von Gerold ausgezeichnet:

http://www.python-forum.de/topic-5095.html

http://wiki.python-forum.de/Von%20Umlau ... 0Encodings

Da ich mir das aber trotzdem immer noch nicht merken kann, hab' ich für mich zwei Funktionen geschrieben:

Code: Alles auswählen

def toIso(a):

    if type(a) == unicode:
        return a.encode("iso-8859-1")
    else:   
        return a

def toUnicode(a):

    if type(a) == str: 
        return a.decode("iso-8859-1")
    else:   
        return a
HTH
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

BlackJack hat geschrieben: Wenn Du alles lesen willst, wäre ein `read()` effizienter als zeilenweise zu lesen und das so ineffizient wieder zusammenzusetzen.
Keine schlechte Idee

Code: Alles auswählen

htmlString=htmlFile.read();
BlackJack hat geschrieben: Warum `findall()` wenn Du eh nur das erste Vorkommen suchst!?
Eher so?:

Code: Alles auswählen

utf8Title=re.search("<title>(.*?)</title>",htmlString).group(1)
Und vielleicht hab ich es denn jetzt auch mal verstanden, das Problem zieht sich natürlich quer durch meinen Quelltext.. *grml* ich sollte das nächste mal gleich darauf achten alle eingehenden Strings in Unicode zu konvertieren und erst bei der Ausgabe das ganze zu codieren...naja man lern nie aus :)

Code: Alles auswählen

# -*- coding: ISO-8859-1 -*-

import urllib
import re

htmlFile=urllib.urlopen("http://www.kuechengoetter.de/rezepte/verschiedenes/Nasi-Goreng-mit-Weisskohl-und-Moehren-18016.html")
htmlString=htmlFile.read();

utf8Title=re.search("<title>(.*?)</title>",htmlString).group(1).split(" : ")[0]
print utf8Title

unicodeTitle=utf8Title.decode("utf8")
print unicodeTitle

isoTitle=unicodeTitle.encode("iso-8859-1")
print isoTitle
Danke an alle !!
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

isoTitle fällt natürlich auf die Nase, wenn ein Zeichen nicht darin kodiert werden kann, hier z.B. € (EURO). (iso-8859-1 <> iso-8859-15 <> win1252, alles ähnlich aber nicht das selbe!)
Antworten