Seite 1 von 1

Python Skript mit Werteübergabe aus Konsole und Rückgabewert

Verfasst: Dienstag 7. Juli 2015, 12:56
von tt-web
Hallo,
ich bin ein kompletter Neuling, also bitte bitte nicht gleich losschreien, wenn ich mit einem wahrscheinlich total banalen Problem komme....

Hintergrundinfo:
Ich habe mich gerade etwas schmerzhaft in openhab (Hausautomatisierung) eingearbeitet und versuche mittels regulärer Ausdrücke eine HTML-Seite zu analysieren, die mir mein Wechselrichter anbietet. Leider kann ich mit der regex, die ich (noch viel schmerzhafter) erarbeitet habe keinen positiven match erzeugen (was wohl ein allgemeines Problem bei openhab/regex darstellt). Egal wie... ich habe jetzt diesen Ausdrück (für zumindest einen Wert den ich rauslesen möchte) gefunden.

Arbeitsumgebung:
Kleiner Raspberry Pi B+, der ohne Monitor, Tastatur usw. läuft... also alles über (Remote-)konsole

Meine Idee:
Ein kleines Pythonskript, dass ich von Openhab aus aufrufen kann. Ich möchte, dass das Skript die Webseite aufruft und mir den gesuchten Wert ausgibt.

Was ich bisher habe:
...ist leider nicht besonders viel...

Code: Alles auswählen

#!/usr/bin/env python
import re
wwwSTR = so.me.ip.add:port/index.fhtml
valueEXP = re.compile(ur'.*?Gesamtenergie<\/td>\n<.*?\n([^\d]+.*?)<\/td>.*')
inputSTR = ..der Webseiteninhalt...
 re.search(valueEXP, inputSTR)

Da ich etwas flexibel bleiben möchte, soll dem Skript der Wert für wwwStr (also die ip-adresse) beim Aufruf mitgegeben werden.
Dies Seite muss irgendwie als Datenstrom(?) an "re.search" übergeben werden
Wie gebe ich das Ergebnis dann aus?

Ich hoffe, dass das Problem so einfach ist, wie ich hoffe und dass ich mich irgendwann mal mit Python zurechtfinde...

LG Thomas

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Dienstag 7. Juli 2015, 13:31
von BlackJack
@tt-web: HTML verarbeitet man mit einer entsprechenden Bibliothek, beispielsweise `lxml.html` oder BeautifulSoup, und nicht alleine mit regulären Ausdrücken. Das spart nerven und ist wesentlich robuster.

Das was Du bisher hast, bzw. zeigst, ist nicht viel sondern gar nichts wenn man mal von Python-Quelltext ausgeht, denn das kompiliert nicht einmal. Also auch nicht wenn man in Zeile 5 einen tatsächlichen Wert stehen hätte. Das ist nicht genug Code damit man von einem konkreten Problem sprechen könnte.

So etwas probiere ich immer in einer interktiven Python-Shell aus und nicht mit einem Skript. Da kann man viel einfacher Variationen ausprobieren und die Ergebnisse ”live” untersuchen.

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Dienstag 7. Juli 2015, 13:35
von tt-web
Hallo,
ja... okay... und wie würde ich mit einer solchen Bibliothek an das Problem herangehen?

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Dienstag 7. Juli 2015, 13:57
von darktrym
Einfach benutzen und freuen keine regex bemühen zu müssen. Du wirst doch selbst wissen wo das Element drinsteckt?

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Dienstag 7. Juli 2015, 13:59
von BlackJack
@tt-web: Sofern noch nicht geschehen sich mit HTML, und CSS und/oder XPath vertraut machen die Dokumentation von einem der beiden (oder beiden) Bibliotheken lesen, die zu verarbeitenden näher analysieren, zum Beispiel in einem Browser mit Entwicklerwerkzeugen (Firefox mit Firefly-Plugin, …), und dann in einer interaktiven Python-Shell eine Lösung bzw. Teillösungen mit der API der jeweiligen Bibliothek und ggf. CSS-Selektoren oder XPath entwickeln und diese Teillösungen dann im Programm verwenden.

Was auch sicher nicht schaden kann ist das Problem in kleinere Teilprobleme aufzuteilen und die jeweils in eigenen Funktionen zu lösen. Dabei dürfen auch Teilprobleme noch einmal aufgeteilt werden wenn sie zu gross sind um sie mit einer einfachen Funktion zu lösen.

Zur Namensgebung und Quelltextformatierung könntest Du auch mal einen Blick in Style Guide for Python Code werfen. Die Typergänzungen in Grossbuchstaben an den Namen in Deinem Code gehen gar nicht. Konkrete Typen haben in Namen nichts zu suchen.

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Dienstag 7. Juli 2015, 14:00
von tt-web
Ja klar weiß ich wo das Element steckt :D In einer bescheuerten verschachtelten Tabelle :D

Welche Bibliothek wäre denn für html am besten geeignet? und "by the way"... was zum henker ist eigentlich "FHTML"?

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Dienstag 7. Juli 2015, 14:06
von tt-web
Vielen Dank schon mal... HTML und CSS ist nicht mein Problem, eher, dass der Seitencode einfach "hingeklatscht" ist. Ziemlich wenig Punkte an denen man sich entlanghangeln kann, deswegen ja auch die regex Lösung... ja das mit dem str und so in den Variablennamen... ich komme von c bzw. vba und es hilft mir persönlich, den Überblick zu behalten, aber ich habe schon gemerkt, das Python anders "tickt" :) Aber es ist mir doch irgendwie sympathisch.

LG Thomas

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Dienstag 7. Juli 2015, 14:15
von BlackJack
@tt-web: Der Henker, äh die Suchmaschine sagt zu FHTML: FHTML.

Was besser ist, `lxml.html` oder BeautifulSoup, ist zu einem gewissen Grad wohl auch Geschmackssache. BeautifulSoup ist in sofern eine etwas ”höhere” Ebene als das man dafür noch einen HTML-Parser als Abhängigkeit braucht und dafür auch `lxml.html` nehmen kann, was AFAIK auch vorgezogen, also automatisch genommen wird auch wenn andere Alternativen installiert sind. Musst halt schauen welche API Dir mehr zusagt. Falls das HTML tatsächlich so wenig Struktur haben sollte das man reguläre Ausdrücke auf den Textinhalt benötigt ist eventuell BeautifulSoup besser geeignet. `lxml.html` hat den Vorteil das es auf der `ElementTree`-API aufbaut, man also eine bekannte API hat wenn man auch mal XML verarbeitet (hat).

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Donnerstag 9. Juli 2015, 05:40
von tt-web
Hallo,
ich habe mein Problem jetzt doch über regular Expressions gelöst und das Skript läuft einwandfrei auch in Zusammenarbeit mit openhab. Danke für die Hilfe. Ich werde die Skripte und Lösungen die ich gefunden habe demnächst auf meinem Blog:https://thomas.flying-bordercollies.de veröffentlichen.

LG Thomas

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Donnerstag 9. Juli 2015, 08:07
von Sirius3
@tt-web: und schon wieder ein Blog-Eintrag, der erklärt wie man auf umständliche und krude weise an Informationen aus einer HTML-Seite kommt. Kein wunder, dass alle Leute, die ähnliche Probleme haben, immer mit den gleichen nicht-funktionierenden Lösungen kommen.

Hier eine saubere Lösung mit lxml:

Code: Alles auswählen

site = lxml.html.parse(url)
value = x.xpath("//td[contains(text(),'Gesamtenergie')]")[0].getnext().text
wenn das nicht eindeutig ist, kann man ganz einfach noch weitere Teile des Pfades angeben.

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Donnerstag 9. Juli 2015, 10:44
von tt-web
Hallo...
also zunächst mal halte ich das Arbeiten mit regulären Ausdrücken nicht für falsch oder unnötig kompliziert. Und ich fühle mich auch unnötigerweise angegriffen. Egal.. mit dem Beispiel kommt bei mir trotz allem nicht die richtige Lösung raus.

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Donnerstag 9. Juli 2015, 10:57
von BlackJack
@tt-web: Das Du re nicht für falsch für diese Aufgabe hältst ist ja das Problem. ;-) Man kann auch Nägel mit dem Griff von einem Schraubenzieher in die Wand schlagen. Es ist trotzdem das falsche Werkzeug, insbesondere wenn man auch das richtige dafür hat und das nicht nur macht weil es nichts anderes gäbe.

Re: Python Skript mit Werteübergabe aus Konsole und Rückgabe

Verfasst: Donnerstag 9. Juli 2015, 10:58
von Sirius3
@tt-web: Deine Lösung ist falsch, weil HTML kein reiner Text ist; falsch, weil es passende Werkzeuge dafür gibt. Du hast ja nie den eigentlichen HTML-Code gezeigt, daher können alle Lösungen nur auf Raten beruhen, was der reguläre Ausdruck halt so hergibt.