NEWS
Parser Regex
-
Hallo, ich versuche gerade daten einer Website auszulesen, leider nicht besonders erfolgreich....
vielleicht hat mir hier jemand den passenden Denkanstoß.
Haben möchte ich einen Zahlenwert, dieser muss gesucht werden:
Zuerst muss "Wort1" gesucht werden, gefolgt von "Wort2" und dann "Wort3", hinter welchem der gesuchte Wert steht.Beispiel: gesucht ist der Wert "85" in
xxxxxxxxxx"Wort2"xxxxxxxxxxxxxxxxxxxxxxx"Wort3"xxxxxxxxxxxxxxxxxxxxxxxxx"Wort1"xxxxxxxxxxxxxxxxxxxxx"Wort2"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Wort3"85
Wort1, Wort2, Wort3 kommen mehrmals vor, aber nur einmal in dieser Reihenfolge - dahinter ist der gewünschte Wert.Wie kann ich danach suchen?
Vielen Dank!
-
@ssk215 sagte in Parser Regex:
Wie kann ich danach suchen?
so wird sas nix
bitte aktuellen quelltext der Seite in code-tags posten, dann kann ich anhand des realen Beisp7els helfen. -
@homoran, wusste nicht so recht wie ich das erklären soll, gesucht wird hier der Wert Temperatur aktuell "7,3°C"(Zeile 48), wäre so dran gegangen das erst nach "Mindelheim | 604m"(Zeile2) gesucht wird, dann nach dem nächsten "Temperatur"(Zeile32) dann nach "aktuell"(Zeile33) und zum Schluss nach dem darauf folgenden Zahlenwert.
<tr> <td height="20" bgcolor="#000033" class="weiss"> wetterwarte süd | Mindelheim | 604m über NN </td> </tr> <tr> <td height="50" bgcolor="#FFFFFF">Die dargestellten Werte repräsentieren die Daten der letzten 24 Stunden!<br> Der Luftdruck ist auf Meereshöhe bezogen!<br> Die Mond-/Sonnen-Daten beziehen sich auf die Standortkoordinaten von 48° 2' 35" Nord - 10° 29' 27" Ost</td> </tr> <tr> <td bgcolor="#FFFFFF"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr bgcolor="#000033"> <td height="1" colspan="5"></td> </tr> <tr onMouseOver="this.style.backgroundColor='#9999CC';" onMouseOut="this.style.backgroundColor='#FFFFFF'" align="left"> <td width="170" bgcolor="#CCCCCC"> Datum | Zeit</td> <td colspan="4"><table width="100%" border="0" cellpadding="5"> <tr> <td width="60%"> <div align="center">Samstag, 2. November 2024 </div></td> <td width="3%"> <div align="center">|</div></td> <td width="37%"> <div align="center">21:50</div></td> </tr> </table></td> </tr> <tr bgcolor="#000033"> <td height="1" colspan="5"></td> </tr> <tr onMouseOver="this.style.backgroundColor='#9999CC';" onMouseOut="this.style.backgroundColor='#FFFFFF'" align="left"> <td width="170" height="40" bgcolor="#CCCCCC"> Temperatur </td> <td height="40"><div align="center">aktuell<br> <nobr>7,3°C</nobr><font size="5"><nobr></nobr></font></div></td> <td height="40"><div align="center">Min.(02:20)<br> <nobr>4,4°C</nobr><font size="4"><nobr></nobr></font></div></td> <td height="40"><div align="center">Max.(22:00)<br> <nobr>8,1°C</nobr><font size="4"><nobr></nobr></font></div></td> <td height="40"><div align="center">Durchschnitt<br> <nobr>7,1°C</nobr></div></td> </tr> <tr bgcolor="#000033"> <td height="1" colspan="5"></td> </tr> <tr onMouseOver="this.style.backgroundColor='#9999CC';" onMouseOut="this.style.backgroundColor='#FFFFFF'" align="left"> <td width="170" height="40" bgcolor="#CCCCCC"> Windchill</td> <td height="40" colspan="1" align="center" bordercolor="#000066">aktuell<br> <nobr>7,3°C</nobr><font size="5"><nobr></nobr></font></td> <td height="40" colspan="1" align="center" bordercolor="#000066">Min.(02:30)<br> <nobr>4,4°C</nobr><font size="4"><nobr></nobr></font></td> <td height="40" colspan="1" align="center" bordercolor="#000066">Max.(12:50)<br> <nobr>8,0°C</nobr><font size="4"><nobr></nobr></font></td> <td height="40" colspan="1" align="center" bordercolor="#000066">Durchschnitt<br> <nobr>7,1°C</nobr><font size="4"><nobr></nobr></font></td> </tr> <tr bgcolor="#000033"> <td height="1" colspan="5"></td> </tr> <tr onMouseOver="this.style.backgroundColor='#9999CC';" onMouseOut="this.style.backgroundColor='#FFFFFF'" align="left"> <td width="170" height="40" bordercolor="#000066" bgcolor="#CCCCCC"><nobr> Luftfeuchtigkeit</nobr></td> <td height="40" colspan="1" align="center" bordercolor="#000066">aktuell<br> <nobr>87%</nobr><font size="5"><nobr></nobr></font></td> <td height="40" colspan="1" align="center" bordercolor="#000066">Min.(19:00)<br> <nobr>85%</nobr><font size="4"><nobr></nobr></font></td> <td height="40" colspan="1" align="center" bordercolor="#000066">Max.(05:00)<br> <nobr>96%</nobr><font size="4"><nobr></nobr></font></td> <td height="40" colspan="1" align="center" bordercolor="#000066">Durchschnitt<br> <nobr>91%</nobr><font size="4"><nobr></nobr></font></td> </tr>
-
@ssk215 sagte in Parser Regex:
wusste nicht so recht wie ich das erklären soll,
deswegen immer zeigen
40\"\sc[^u]+uell<br>[^>]+>([\d,]+)
müsste passen
bei der kürzeren Varianteell<br>[^>]+>([\d,]+)
muss Num auf 1 oder 2 gesetzt werden, da 7,4°C zweimal vorkommtedit:
geht einfacher
er">a[^\d]+([\d,]+)
und wenn es der zweite Treffer sein soll6">a[^\d]+([\d,]+)
-
@homoran Was soll ich sagen - es funktioniert -Vielen Dank -hat mir extrem auf die Sprünge geholfen wie das ganze funktioniert.
Nur leider hatte ich mir das einfacher vorgestellt, insbesondere wenn noch mehr Werte aus dem Quelltext abgefragt werden sollen(Luftfeuchtigkeit etc.), deswegen auch die Frage mit dem Aufbau mit Schlüsselwörtern(Mindelheim, Temperatur, aktuell...)
Ich hatte mir nach dem Denkanstoß von dir noch das gebastelt:/ Mindelheim \| 604m.+Temperatur.+aktuell<br>[^>]+>([+-]?(?=\.\d|\d)(?:\d+)?(?:\.?\d*))(?:[eE]([+-]?\d+))?/s
in https://regex101.com/ funktioniert das ganze, leider aber nicht im Parser bzw. ich weiß nicht wie ich die Option /s angeben kann/ob das überhaupt möglich ist.
Viele Grüße
-
@ssk215 sagte in Parser Regex:
deswegen auch die Frage mit dem Aufbau mit Schlüsselwörtern(Mindelheim, Temperatur, aktuell...)
der Weg ist prinzipiell richtig, aber nicht ganz so einfach.
So ganz lange Sprünge gehen nicht. Man muss sich immer über Haltepunkte hangeln.
Man (ich) sucht sich so dicht wie möglich an dem gesuchten Wert eine möglichst eindeutige Stelle. von Dort aus dann nahtlos weiter bis zum Wert.
Einfach mehrere Worte die hintereinander irgendwo im Text virkommen, helfen nicht.ich arbeite auch über regex 101.
Was soll beim neuen rauskommen?
dein Versuch sagt da bei mir "pattern error"Luftfeuchtigkeit:
/igk[^u]+[^\d]+(\d+)
-
du kannst es mal so probieren
die s option von regex101 brauchst du nicht, da der parseradapter alle zeilenumbrüche mit einem leerzeichen ersetzt. daher ist dort alles eine einzige zeileMindelheim.*Temperatur\s</td>\s+<td height="40"><div align="center">aktuell<br>\s+<nobr>(([\d,]+))°C</nobr><font size="5"><nobr></nobr></font></div></td>
es würde aber auch das folgende schon reichen
"center">aktuell<br>\s+<nobr>([\d,]+)°C</nobr>
den ersten vorschlag habe ich mal gepostet, da du wohl den ort und das wort temperatur mit drin haben wolltest.
ich habe mal vor einiger zeit eine anleitung geschrieben wie man am besten vorgeht
https://forum.iobroker.net/topic/8379/einlesen-von-aktienkursen/81 -
Ich habe eine externe webseite mit https://...
womit ich einen Parse-Error erhalte. Kann man das beheben? -
@werner2000x was genau willst du uns sagen?
Um helfen zu können braucht es mehr Informationen. -
@homoran Ich habe bisher im Parser nur IP adressen aus dem lokalen WLAN verwendet.
Das hat funktioniert.
Nun möchte ich aus einer gesicherten Webseite mit https: Werte auslesen und bekomme im Parser immer den Fehler " Parse Error"
Die gesicherte Webseite zeigt meinen Blutzucker den ich auch im Handy unter 127.0.0.1:17580 erhalte. Ich habe keinen Weg gefunden diesen Wert vom Handy in den Raspi lesen zu können. Das würde dann ohne https: gehen.
Ich habe also die lokale Webseite des Handy 127.0.0.1 über die App " localtonet" auf eine allgemeine gesicherte Webseite weitergeleitet um sie auf einen Parser im Raspi auszuwerten zu wollen. -
@werner2000x sagte in Parser Regex:
Nun möchte ich aus einer gesicherten Webseite mit https: Werte auslesen und bekomme im Parser immer den Fehler " Parse Error"
ich wüsste nicht was das mit https:// zu tun haben soll.
Da scheint noch was anderes reinzuspielen.
Aber wie gesagt:
ohne Informationen kann man nicht helfen.@werner2000x sagte in Parser Regex:
den ich auch im Handy unter 129.0.0.1:17580
oder eher 127.0.0.1??
das ist localhost.
Dazu müsstest du den iob Server auf dem Handy laufen haben -
@homoran ja, es ist 127.0.0.1
Das iob läuft aber nicht auf den Handy. -
@werner2000x sagte in Parser Regex:
Das iob läuft aber nicht auf den Handy.
Natürlich nicht!
Deswegen geht das ja auch nicht.Wenn du im Parser Adapter die 127.0.0.1 eingibst such der Parser auf dem RasPi oder was immer du hast, nach der Seite, die es dort natürlich nicht gibt
-
@homoran das ist ja der Grund warum ich die Seite auf eine öffentliche Webseite übertragen habe. Leider geht das nur mit https:
-
@werner2000x sagte in Parser Regex:
@homoran das ist ja der Grund warum ich die Seite auf eine öffentliche Webseite übertragen habe. Leider geht das nur mit https:
???
ja und?
die rufst du auch mit https://127.0.0.1 auf??welche Seite willst du jetzt aufrufen?
und wie?
wie sieht da der Quelltext aus? -
@homoran nein, diese Webseite kann ich überall aufrufen mit https://62jsxxxc.localto.net/
P..S. den webseiten namen habe ich verändert
damit nicht jeder meinen Blutzucker
sehen kann -
@werner2000x du solltest diese Seite hier nicht einstellen, hab den Link gelöscht!
hast du im bisherigen Verlauf etwas geändert?
Da stehen Dinge die vorher nicht da standen.
So etwas geht gar nicht! -
@werner2000x sagte in Parser Regex:
immer den Fehler " Parse Error"
bitte genaue und vollständige Fehlermeldung
@homoran sagte in Parser Regex:
hast du im bisherigen Verlauf etwas geändert?
Da stehen Dinge die vorher nicht da standen.
So etwas geht gar nicht!schon wieder etwas nachträglich irgendwo hinzugefügt?
was soll das?
-
@homoran ja, ich hatte selbst gemerkt das ich die 129 falsch eingetragen waren und habe es nach 127 korrigiert aber da zwischen hast du schon geantwortet gehabt.
-
@werner2000x sagte in Parser Regex:
@homoran ja, ich hatte selbst gemerkt das ich die 129 falsch eingetragen waren und habe es nach 127 korrigiert aber da zwischen hast du schon geantwortet gehabt.
das ist aber nicht alles!
Du zerstörst damit den Sinnzusammenhang der nachfolgenden Antworten.
Ein späterer Leser kommt dann gar nicht mehr klar!