Seite 1 von 1

String Encoding

Verfasst: Montag 22. Februar 2010, 17:25
von da.dom
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

Verfasst: Montag 22. Februar 2010, 17:45
von 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!?

Re: String Encoding

Verfasst: Montag 22. Februar 2010, 17:47
von /me
Vielleicht hilft dir schon folgendes:

Von Unicode woanders (UTF-8, ISO88-59-1, ...) hin: encode
Von woanders nach Unicode: decode

Verfasst: Montag 22. Februar 2010, 18:20
von cofi
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).

Verfasst: Montag 22. Februar 2010, 18:47
von 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

Verfasst: Dienstag 23. Februar 2010, 10:21
von da.dom
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 !!

Verfasst: Dienstag 23. Februar 2010, 12:38
von mkesper
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!)