Umlaute führen zum Skriptabsturz

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
Gast

Hallo,

der folgende Code liest eine xml-Datei mt Timerdaten von tvinfo.de und übergibt diese Daten dann an die Dreambox. Problem an der Sache ist aber, wenn in der xml-Datei Umlaute im Titel sind, bricht die Ausführung ab.

Der Autor des Codes meldet sich leider nicht und ich hätte so gern eine Lösung wie diese und leider selber keine Ahnung von Python...

Wie ich gelesen hab, ist das Problem auch anscheinend nicht ganz trivial (es gibt massig Beiträge mit vielen verscheidenen Ratschlägen). Gefragt ist also ein Stück Programmcode, der den Fehler in der Programmausführung irgendwie übergeht.

Hier der Code:

Code: Alles auswählen

 #!/usr/bin/python
# -*- coding: Cp1252 -*-
import sys, urllib, md5, re
from xml.dom import Node
from xml.dom.ext.reader.Sax import FromXmlFile
from xml.dom.ext.reader import Sax2
from time import *


# py2exe braucht das, warum auch immer
import encodings.utf_16_be
import encodings.idna
import encodings.ascii
import encodings.cp850

     

openepgXML = ''

#for debugging
FROMFILE = False



class tvinfo2dreambox_class:
    def __init__(self,settings=None):
            self.settings = settings or {}
       
    def ReadSettings(self):
        #reader = Sax2.Reader()
        settings_dom = Sax2.FromXmlFile('settings.xml')
   
        server_node = settings_dom.getElementsByTagName("server")
        self.settings['url'] = server_node[0].getAttribute('url')
        self.settings['urlparams'] = {}
        self.settings['timerurl'] = settings_dom.getElementsByTagName("timerurl")[0].getAttribute('url')
        self.settings['vorlauf'] = int(settings_dom.getElementsByTagName("dreambox")[0].getAttribute('vorlauf'))
        self.settings['nachlauf'] = int(settings_dom.getElementsByTagName("dreambox")[0].getAttribute('nachlauf'))
        urlparams = server_node[0].getElementsByTagName("param")
        for urlparam in urlparams:
            if urlparam.getAttribute('md5') == "true":
                self.settings['urlparams'][urlparam.getAttribute('name')] =  md5.new(urlparam.getAttribute('value')).hexdigest()
            else:
                self.settings['urlparams'][urlparam.getAttribute('name')] = urlparam.getAttribute('value')
          
        self.settings['channels'] = {}
        channels = settings_dom.getElementsByTagName("channel")
        for channel in channels:
            self.settings['channels'][channel.getAttribute('tvinfo')] =  channel.getAttribute('dreambox')

      
    def ReadTvinfo(self):
      if (FROMFILE == True):
          print "reading tvinfo from file\n"
          self.tvinfo_node = Sax2.FromXmlFile('tvinfocache.xml')
           else:
               print "reading tvinfo from http\n"
               params = urllib.urlencode(self.settings['urlparams'])
               f = urllib.urlopen(self.settings['url']+"?%s" % params)
               openepgXML = f.read()
               #print openepgXML
               reader = Sax2.Reader()
               self.tvinfo_node = reader.fromString(openepgXML)
   
    def ConvertTime(self,intime,addseconds=0):
        times = re.compile(r'(?P<year>[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9])'
                                            r' (?P<hour>[0-9][0-9]):(?P<minutes>[0-9][0-9]):(?P<seconds>[0-9][0-9])').search(intime)
        unitime = times.group('year')+"-"+times.group('month')+"-"+times.group('day')+" "+times.group('hour')+":"+times.group('minutes')+":"+times.group('seconds')
       

        return localtime(mktime(strptime(unitime,"%Y-%m-%d %H:%M:%S"))+addseconds)
   
    def SubmitTimer(self):
        entrys = self.tvinfo_node.documentElement.getElementsByTagName("epg_schedule_entry")
        if entrys.length:
            for entry in entrys:
                getparams = {}
                getparams['command'] = 'add'
                # Wenn in der Channelliste eine Übersetzung steht
                if (self.settings['channels'].has_key(entry.getAttribute('channel'))):
                    getparams['channel'] = self.settings['channels'][entry.getAttribute('channel')]
                else:
                    getparams['channel'] = entry.getAttribute('channel')
               
                getparams['descr'] = entry.getElementsByTagName('title')[0].firstChild.data

                time = self.ConvertTime(entry.getAttribute('starttime'),((-1*self.settings['vorlauf'])*60))
                getparams['sday'] = strftime("%d",time)
                getparams['smonth'] = strftime("%m",time)
                getparams['shour'] = strftime("%H",time)
                getparams['smin'] = strftime("%M",time)
      
                time = self.ConvertTime(entry.getAttribute('endtime'),(self.settings['nachlauf']*60))
                getparams['eday'] = strftime("%d",time)
                getparams['emonth'] = strftime("%m",time)
                getparams['ehour'] = strftime("%H",time)
                getparams['emin'] = strftime("%M",time)
               
                params = urllib.urlencode(getparams)
                f = urllib.urlopen(self.settings['timerurl']+"?%s" % params)
                httprequest = f.read()
                print "Channel: "+getparams['channel']+"\nSendung: "+getparams['descr']+"\nReturns: "+httprequest+"\n"
           
def main():
   
    tvinfo2dreambox.ReadSettings()
    #print tvinfo2dreambox.settings['urlparams']
    tvinfo2dreambox.ReadTvinfo()
    tvinfo2dreambox.SubmitTimer()
    return 0


   
tvinfo2dreambox = tvinfo2dreambox_class()

if __name__ == '__main__':
    main()
In der Zeile:

getparams['descr'] = entry.getElementsByTagName('title')[0].firstChild.data

liegt wohl das Problem begraben. Wahrscheinlich kracht de Ausführung wenn 'title' nach 'descr' übergeben wird und sich in 'title' ein Umlaut befindet. Gibt es eine Möglichkeit, diesen Fehler zu übergehen?

Das Script und den Sourcecode hab ich unter

http://www.va-kanz.de/files/tvinfo2dreambox-0.1.zip abgelegt.

Noch zur Erklärung des Services von tvinfo.de:

tvinfo.de bietet einen Merkzettel an, auf dem man sich Suchergebnisse automatisch oder manuell nazeiigen lassen kann. Auf diesem Merkzettel kann man auch vermerken, dass selektierte Sendungen aufgenommen werden sollen. Diese Sache ist ungeheuer praktisch um seine Timerungen zu programmieren. Diesen Merkzettel kann man sich auch als xml-Datei ausgeben lassen.

Um an die xml-Datei zu kommen muss man bei tvinfo.de einen Account anlegen, einen Merkzettelanlegen und bei den Einstellungen dort als 'Recording Device' OpenEPG auswählen.

Danach kann man unter...

http://www.tvinfo.de/share/openepg/sche ... d5password>

seinen Merkzettel als xml-Datei aufrufen oder eben weiter verarbeiten.

Es wäre wirklich super, wenn mir jemand bei meinem Problem helfen könnte. Ich habe keine Lösung finden können, ich hab aber auch keine Ahnung von Python.

Vielen Dank schon mal im Voraus. Es wäre wirklich supernett, wenn mir jmd. helfen könnte.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Hi, das ganze ist nur eine ganz dumpfe Vermutung. Aber ich denk mal das ist für eine englische Seite geschrieben. Deshalb verwendet er auch einen anderen Zeichensatz.
Probier einfach mal
# -*- coding: Cp1252 -*-
durch das zu ersetzen.
# -*- coding: UTF-8 -*-
BlackJack

Das wird nichts nützen. Die Angabe der Kodierung ist ausschliesslich für den Quelltext wichtig und sollte am besten auch die Kodierung sein in der der Quelltext geschrieben wird.

Die Zuweisung dürfte eigentlich keinen Fehler auslösen. Könntest Du ("Gast") vielleicht den Traceback hier posten, den Du bekommst? Andernfalls können wir nur raten.
Antworten