Ankündigung

Einklappen
Keine Ankündigung bisher.

HTMLParser läuft nur im interaktiven Modus, nicht als Plugin

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HTMLParser läuft nur im interaktiven Modus, nicht als Plugin

    Hallo,

    ich nutze folgenden Code in einer Logik:
    Code:
    class MyHTMLParser(HTMLParser):
        def __init__(self):
          super(MyHTMLParser, self).__init__()
          #HTMLParser.__init__(self)
          self.id = []
          self.data = []
          self.tag=None
          self.temp=[]
        def handle_starttag(self, tag, attrs):
          if tag != 'div':
            logger.debug('no div')
            return   
          self.tag=tag   
          self.temp=[]      
          for attr in attrs:
                v=attr[1].split('pos')
                if len(v)>1:
                    self.id.append(int(v[1]))
        def handle_data(self, data):
          if self.tag=='div':
            logger.debug('div with data'+str(data))
            self.temp.append(data)
        def handle_endtag(self, tag):
          if tag == 'div':    
            s="".join(self.temp)
            s=s.replace(',','.')
            s=s.replace('AUS','0')
            s=s.replace('EIN','1')
            logger.debug ('closing tag and saving ' + s)
            self.data.append(clean(s))  
    [....]
    
    html = str(sh.tools.fetch_url(url))
    logger.debug('[UVR] ' + str(html))
    parser = MyHTMLParser()
    parser.feed(str(html))
    Wenn ich den parser aufrufe, gibt es diesen Fehler:
    Code:
    2014-05-02 13:02:44,398 ERROR    UVR          Logic: UVR, File: /usr/local/smarthome/logics/uvr.py, Line: 32, Method: __init__, Exception: global name 'MyHTMLParser' is not defined -- scheduler.py:_task:346
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 339, in _task
        exec(obj.bytecode)
      File "/usr/local/smarthome/logics/uvr.py", line 101, in <module>
        parser = MyHTMLParser()
      File "/usr/local/smarthome/logics/uvr.py", line 32, in __init__
        super(MyHTMLParser, self).__init__()
    NameError: global name 'MyHTMLParser' is not defined
    Kann ich in einer Logik keine Klassen definieren?
    Es soll ohnehin ein Plugin werden, aber eine Logik ist einfacher zu debuggen.

    Gruß,
    Hendrik
    Angehängte Dateien

    #2
    Hallo Hendrik,

    passt die Überschrift zu dem Inhalt? Ich hätte was anderes vermutet.

    Zitat von henfri Beitrag anzeigen
    Hallo,
    Kann ich in einer Logik keine Klassen definieren?
    Da bin ich mir momentan nicht sicher. Eine Logik läuft innerhalb einer "Container" Funktion ab. Google mal nach Klassendefinition in Funktionen.

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo,

      sorry Marcus. Läuft nicht als Plugin hätte ich schreiben sollen.
      Alles läuft am Prompt von smarthome.py -i. Als LOGIK nicht (kann den Betreff nicht mehr ändern. Du?)
      Du schreibst, dass im Falle der Logik der Code in einer Container-Funktion ausgeführt werden. Das wäre eine Erklärung, vorausgesetzt, Klassen in Funktionen funktionieren in python nicht.
      Hier wird das diskutiert, aber ich bin nicht sicher, ob das nicht zu hoch für mich ist. Ich versuche es morgen mit frischerem Geist nochmal.

      Gruß,
      Hendrik

      Kommentar


        #4
        Hallo,

        das Problem ist, dass in der Klasse nicht alles, was vorher definiert/importiert wurde verfügbar ist.

        So funktioniert es jetzt:
        Code:
        class MyHTMLParser(HTMLParser):
            def __init__(self):
              super().__init__()
              #HTMLParser.__init__(self)
              self.id = []
              self.data = []
              self.tag=None
              self.temp=[]
        ...
        Auch die Funktion clean() die ich weiter oben definiert habe, war in der Klasse nicht verfügbar.

        Gruß,
        Hendrik

        Kommentar

        Lädt...
        X