Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
In meinem Fall ist es keine generische Webseite, ich bekomme über ne API folgende xml Struktur zurück (Gekürzt, nur die ersten Zeilen zur Veranschaulichung)
Hier ändert sich natürlich an der Struktur nichts und kann auch prima für Logiken genutzt werden. Ich nutze es zb aktuell für die relative Außenluftfeuchtigkeit, da ich noch keinen Sensor dafür habe. (Fehlplanung meinerseits)
Aber grundsätzlich hat gaert schon recht, das Risiko einer Änderung auf einer Webseite ist enorm.
Generell ist das Auswerten einer Webseite natürlich eine "Krücke" - jede kleine Änderung an der Seite führt u.U. dazu, dass die Auswertung scheitert. Oder noch schlimmer: Unerwartete Werte liefert - z.B. die Regenmenge anstelle der Temperatur, plötzlich werden 1000 Grad gemeldet und die Heizung spinnt
Für rein visuelle Zwecke ist's natürlich egal, aber ich würde mit den so ermittelten Werten keinesfalls "arbeiten" wollen (Logik, etc.)!
Guten Morgen die Herren,
ich sitze ja seit Tagen dran (also nicht ganze Tage) Michael seine Erläuterung
zu verstehen. Klappt jetzt auch ganz gut.
Anbei einmal der für mich leicht erweiterte Text von Michael in meine „Hilfedatei“.
Darein werde ich dann auch den LBS packen.
Nun einfach noch mal eine Frage vom Ablauf des Befehls preng_match:
Also: ("/Lufttemperatur \(2m\).*?aktuell.*?([0-9\.,]+.C)/s" Quellcode.JPG
1) Im Quellcode wird nach dem Schlüsselwort: Lufttemperatur \(2m\)gesucht.
(den Schlüsselwert Lufttemperatur denke ich brauche ich, da auf der Seite noch mehr Temp.werte sind).
2) Danach wird der eigentliche auszuwertende Wert/ String aktuell gesucht und entsprechend mit den
Auswertbefehlen ([0-9\.,]+.C) der eigentliche Wert rausgesucht. Das C am Ende begrenzt den zu
suchenden String.
Kann man sich das so erklären? Oder (wegen dem von innen nach außen Abarbeiten) läuft das anders?
Gruß Marcus EDOMI Webseitenabfrage V1.1.pdf
Das liegt am Forum... wie gewohnt habe *ich* alles gemacht
Das Forum hat irgendwie die backslashes zwischen den " gefressen, da sollte also eigentlich " \ " stehen und nicht ""
DU DOCH NICHT!!!! Dachte mir schon, das hier jemend was gefressen hat!!!!
Die Tage mache in mal weiter und sehe dann wer noch was hier gefressen hat!!!
DANKE DIR!!!!
Leider weiß ich nicht genau ob Du hier etwas flasches sagst:
Das liegt am Forum... wie gewohnt habe *ich* alles richtig gemacht
Das Forum hat irgendwie die backslashes zwischen den " gefressen, da sollte also eigentlich " \ " stehen und nicht ""
Zuletzt geändert von wintermute; 25.05.2016, 17:45.
Hallo Michael!!!! DANKE für die tolle Erläuterung!!!!!
Dem kann ich mich nur anschließen! Ich bin leider aktuell Beruflich etwas sehr eingespannt als das ich Zeit fürs experimentieren finde.
Aber mit der Erklärung werde ich dann sicherlich auch weiterkommen (allgemein was Regexp angeht )
Hallo Michael,
ich bin dabei deine tollte Erklärung zu deuten.
Leider weiß ich nicht genau ob Du hier etwas flasches sagst: Ich zitiere:
Zunaechst wird also nach "Lufttemperatur (2m)" gesucht, die "" vor den Klammern sind zum Escapen, da Klammen in regulaeren Ausdruecken eine besondere Bedeutung haben - wir hier aber einfach nur nach Klammern suchen wollen. Müsste es nicht lauten:
Zunaechst wird also nach "Lufttemperatur (2m)" gesucht, die \ \ (also \(2m\)) vor den Klammern sind zum Escapen, da Klammen in regulaeren Ausdruecken eine besondere Bedeutung haben - wir hier aber einfach nur nach Klammern suchen wollen.
P.S. leider kann es sein, dass ich Dich noch öfters "anhaue"
DANKE DIR vorab!!
Hallo Michael!!!! DANKE für die tolle Erläuterung!!!!!
Ein Teil habe ich schon im Netz gefunden, aber die "Schachtelung" ist schön von Dir erklärt!!
Das /s habe ich bei Dir erst verstanden!!!
Ich mache mich heute und die Tage mal ran EINEN Wert hin zu bekommen Dann werde ich
mich an die weiteren Werte machen!!!
ALSO DANKE DIR für die Mühe des Erklärens!!!
Gruß Marcus
Zuletzt geändert von tunneltruppe; 25.05.2016, 12:10.
1) mit preng_match kann man die Webseite (mit der Definition zwischen /) auswerten.
Und ja es kommen einige Werte in der Seite zusammen (numerische und Text- Werte)
Ich versuch mal kurz, die RegExp zu erlaeutern (normalerweise faengt man bei mehreren Klammer-Ebenen IMMER innen an, aber sowas haben wir hier ja zum Glueck nicht wirklich )
Begrenzt wird sie jeweils durch "/", an Anfang & Ende, dafuer koennen auch andere Zeichen genommen werden. tut man gern wenn innerhalb der der RexExp zB selbst sehr viele "/" vorkommen die man alle escapen muesste (was man mit einem vorangestellten "" tut) sofern man die Begrenzer nicht aendert. Folgende RegExp (mit geaendertem Begrenzer) waere also identisch zu der urspruenglichen:
Das "s" am Ende bedeutet, dass der Vergleich ueber Zeilentrenner hinweg durchgefuehrt wird.
Zunaechst wird also nach "Lufttemperatur (2m)" gesucht, die "" vor den Klammern sind zum Escapen, da Klammen in regulaeren Ausdruecken eine besondere Bedeutung haben - wir hier aber einfach nur nach Klammern suchen wollen.
Das ".*?" danach ist aus drei Elementen aufgebaut, wobei "." fuer ein beliebiges Zeichen steht, "*" fuer keines oder beliebig viele des voranstehenden Elementes und "?" fuer "nicht gierig werden" (also "ungierig" nach beliebig vielen beliebigen Zeichen suchen), danach wird ein "aktuell" erwartet. Taete man das "?" weglassen, dann wuerde das "aktuell" sowie alles folgende von dem ".*" mit einverleibt werden, das "?" sorgt also quasi dafuer nur solange wie noetig zu suchen...
Nach dem "aktuell" kommt wieder ein ".*?", dann kommt eine Klammer...
PHP-Code:
([0-9\.,]+.C)
Wir erinnern uns: bei Klammerungen immer innen anfangen zu lesen
"[0-9\.,]" ist eine Aufzaehlung von moeglichen Zeichen, hier also die Zahlen "0-9", der Punkt "\." (welcher escaped werden muss, weil der "." allein ja - siehe oben - sonst eine andere Bedeutung haette) sowie ein ",". Entweder das Komma oder der Punkt waren ueberfluessig, ich weiss aber nicht mehr ob in der Webseite nu "3.4" oder "3,4" standen, drum steht da jetzt beides drin.
Das "+" bedeutet "eins oder mehr" und bezieht sich (wie oben das "*" auch) auf das voranstehende Element, hier also die Auflistung in eckigen Klammern.
Es wird also eine nicht-leere Zeichenfolge gesucht, die aus Zahlen, Komma und Punkten bestehen kann.
Dann kommt wieder ein "." (fuer beliebiges Zeichen, hier aber nur eines, weil ja kein "*" oder "+" dahinter steht) und schliesslich ein "C".
Der Kram in der Klammer wuerde also zB das hier finden:
19,55...5223,121MC
oder auch
19.2°C
allerdings kein
ab,c°C
Wichtig an der Stelle ist, dass der gesuchte String mit einem "C" aufhoeren wird.
Alles was in der RegExp in Klammern steht (also hier unser letzter Teil) findet sich dem preg_match in dem Array wieder, welches man als 3. Parameter angegeben hat, bei mir also in $matches.
$matches[0] enthaelt den kompletten gefunden String
$matches[n] dann jeweils den Inhalt der n-ten gefundenen Klammer, wobei von "vorn nach hinten" und von "aussen nach innen" gezaehlt wird. In $matches[1] steht also die gesuchte Temperatur.
Einfach mal probieren nach demselben Muster andere Werte aus der Webseite auszulesen, dabei einfach nach eindeutigen Mustern im Quellcode suchen und versuchen die ueber eine entsprechende RegExp "einzufangen". Die obige welche sollte schonmal ein guter Anfang sein
Das sieht vllt kompliziert aus, ist aber wirklich ganz einfach...
Um auf die Frage zurueck zu kommen: man kann nun mit einer entsprechend komplizierten RegExp alle gesuchten Werte auf einmal abfragen - wenn man eben die entsprechenden Klammern setzt. Aber das wird schnell sehr lang und unueberschaubar...
2) Diese Werte muss ich dann mit Regexp im Logikbaustein in einen Ausgangswert schreiben?
...
preg_match($regexp, $result, $string);
setLogicLinkAusgang($id,9,$string[1]);
Also müsste ich dann den Befehl preng_match in den regexp einbinden? Könnte ich so dann alle Webseitendaten
In jeweils einen Befehl abfragen?
Ich glaube, das versteh ich grad nicht... jedenfalls kannst Du (s.o.) alle Werte in einem Rutsch rausbasteln oder fuer jeden gewuenschten Wert ein eigenes preg_match anlaufen lassen. Gehen tut beides, letzteres taete ich persoenlich der Lesbarkeit halber bevorzugen - zumindest bei groesseren Abfragen.
Ich hoffe das hilft irgendwem tatsaechlich, dann haette ich nicht alles umsonst getippert
Somit kannst du doch preg_match() === false machen. Oder verstehe ich dich falsch?
Ich meinte eher die entstehenden Syntax-Fehler bei zB fehlenden " oder '... das faehrt dann EDOMI immer an die Wand, vermute ich.
Man muesste (oder sollte) sich auf jeden Fall Gedanken darueber machen wie man das moeglichst sorgfaeltig escaped ohne die eigentliche RegExp kaputt-zu-escapen. Und dann am besten im LBS das error_reporting wegbiegen, sonst landen die Warnings (die vermutlich auch beim Ergebnis FALSE kommen werden) alle im Edomi-Errorlog, was unschoen waere.
Ich hab aber grad keine Zeit LBS zu schreiben, sry
Klar, aber Du kennst das ja: Spätestens übermorgen heißt es dann "Wie kann ich mehrere(!) Werte aus einer Webseite auslesen?!" Und und und...
Aber wie wäre es mit einem LBS, der einigermaßen universell arbeitet:
E1 = URL
E2 = RegEx-String
...
Entschuldigt Leute, aber ihr seid zu schnell (und zu gut!!!) und hängt mich ab!!
Also:
1) mit preng_match kann man die Webseite (mit der Definition zwischen /) auswerten.
Und ja es kommen einige Werte in der Seite zusammen (numerische und Text- Werte)
2) Diese Werte muss ich dann mit Regexp im Logikbaustein in einen Ausgangswert schreiben?
Auszug aus dem 19000210 (NIBE- Wärmepumpe) / Status
$regexp="#ID40004">(.*?)°#";
preg_match($regexp, $result, $string);
setLogicLinkAusgang($id,9,$string[1]);
// print "Aussentemperatur : $string[1]\r\n";
Also müsste ich dann den Befehl preng_match in den regexp einbinden? Könnte ich so dann alle Webseitendaten
In jeweils einen Befehl abfragen?
Anbei meine erste Überlegung zu einer Hilfe!!! Nur mal so!! EDOMI Webseitenabfrage.pdf
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Einen Kommentar schreiben: