FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ramses am 10 November 2016, 21:40:05

Titel: regex Kenner gesucht
Beitrag von: ramses am 10 November 2016, 21:40:05
Hi,

ich möchte den Dieselpreis aus einer Webseite mittels RegEx auslesen.
httpmod bereits installiert und konfiguriert.

der Wert readingsRegex_Diesel schaut so aus
<div class="labelField">Diesel</div>[^0-9]+([0-9\,]+)

und ein Teil der html Seite
<tbody><tr>
<td class="label" style="width:100px">
   <div class="labelField">Diesel</div>
</td>
  td class="content" style="width:100px">
   <div>
    1,023
   </div>   
  </td>
<td class="content">
  heute,
  19:20
</td>
</tr>



Ziel ist es in der Form 1,023€ - heute, 19:20 zu bekommen

jetzt bekomme nur 100 als Ergebnis (von ersten 100px) und weiss leider nicht mehr weiter.
Bitte um Unterstützung!
Titel: Antw:regex Kenner gesucht
Beitrag von: Wuppi68 am 10 November 2016, 21:43:33
such mal nach Benzin oder Spritpreis Monitor

da gibt es schon "fertiges" das funktioniert
Titel: Antw:regex Kenner gesucht
Beitrag von: papa am 10 November 2016, 21:44:54
RegEx lassen sich hier http://www.regexe.de/ (http://www.regexe.de/) gut testen.
Titel: Antw:regex Kenner gesucht
Beitrag von: Wuppi68 am 10 November 2016, 21:47:46
hier https://forum.fhem.de/index.php/topic,22554.0/topicseen.html ist der Link dahin
Titel: Antw:regex Kenner gesucht
Beitrag von: ramses am 15 November 2016, 20:02:38
Danke euch für die Hinweise!
Jedoch kommen in dieser Seiten keine Tankstellen für Wien vor. :-(

daher ist meine Frage noch aktuell. Ich habe auch noch andere Seiten gefunden, wo man RegEx testen kann, vorausgesetzt man weißt wie sie funktionieren.
Das verstehe ich leider nicht zu 100%.

In meinem Fall müsste ich mit dem matchen bei einer bestimmte Position anfangen.
Nämlich diese
<div class="labelField">Diesel</div>

wie teile dem RegEx Engine das mit? Einfach den Text vor dem RegEx Ausdruck stellen? Wenn ich das auf die RegEx Testseiten mache, funktioniert gar nichts.

wenn ich auf einer Testseite (zB regex101.com (http://regex101.com)) das [^0-9]+([0-9\,]+) eingebe, funktioniert zwar aber den gesuchten Preis wird erst als 3ter Match gefunden.
Wie teile ich dem RegEx Engine mit, dass ich nur den 3ten Match haben will?

Titel: Antw:regex Kenner gesucht
Beitrag von: papa am 16 November 2016, 00:17:24

.*Diesel[^,]*(\d,\d{3}).*\sheute,\s*(\d{2}:\d{2}).*


Die erste Gruppe matched den Preis, die zweite die Uhrzeit.
Titel: Antw:regex Kenner gesucht
Beitrag von: Prof. Dr. Peter Henning am 16 November 2016, 12:39:48
Ich schlage vor, stattdessen bei diesem Modul mit XPath zu arbeiten - das ist viel einfacher.

LG

pah
Titel: Antw:regex Kenner gesucht
Beitrag von: ramses am 17 November 2016, 23:40:59
Danke mal für eure Vorschläge,aber bevor zum Thema RegEx/xPath weiterkommen, kann ich mir folgendes nicht erklären

Nachdem ich das definiert habe

define Spritpreis HTTPMOD http://www.oeamtc.at/spritapp/ShowGasStation.do?spritaction=show&gsid=1208465 15
attr Spritpreis readingsName_Diesel1 readingsRegex_Diesel1
attr Spritpreis readingsName_Diesel1 Diesel1
attr Spritpreis readingsRegex_Diesel1 .*Diesel[^,]*(\d,\d{3}).*\sheute,\s*(\d{2}:\d{2}).*
attr Spritpreis stateFormat Preis: Diesel1 €


wird der reading Diesel1 einmal aktualisiert (es steht 1 drin, weil die RegEx war leer am Anfang) und dann nie wieder und bekomme im Log

2016.11.17 23:35:52 3 : Spritpreis: Read response to update didn't match any Reading

was nach mein Verständnis so viel heisst, FHEM kann kein Reading mit dem Namen Diesel1 finden, wo das Ergebnis geschrieben werden kann...

ist eventuell ein bug hier noch aktiv oder bin ich zu dumm es zu verstehen?
Titel: Antw:regex Kenner gesucht
Beitrag von: Prof. Dr. Peter Henning am 18 November 2016, 08:49:51
Natürlich ist das noch fehlerhaft - was soll denn die zweimalige Setzung eines Attributes
attr Spritpreis readingsName_Diesel1 readingsRegex_Diesel1
attr Spritpreis readingsName_Diesel1 Diesel1

bewirken ?

LG

pah
Titel: Antw:regex Kenner gesucht
Beitrag von: ramses am 19 November 2016, 09:52:57
ja, stimmt das dürfte zu viel sein, habe ich aber aus der fhem.cfg kopiert.
Also wenn ich die Einträge einzeln über die command line ausführe, werden sehr komische Sachen in die fhem.cfg geschrieben.

ich habe den Device Spritpreis mehrmal gelöscht und neu angelegt. Jetzt wird der Reding gar nicht mehr angelegt

verstehe einfach nicht...
Titel: Antw:regex Kenner gesucht
Beitrag von: Prof. Dr. Peter Henning am 19 November 2016, 10:43:36
Na, dann schlage ich doch mal vor, die Commandref zum Modul HTTPMOD zu lesen.

LG

pah
Titel: Antw:regex Kenner gesucht
Beitrag von: ramses am 19 November 2016, 11:49:46
ich habe es gelesen, mehrmals, und habe die alte und neue Schreibweise ausprobiert. Der Reading erscheint nicht mehr und die Fehlermeldung im Eventmonitor besteht

ich habe folgendes gemacht, Schritt für Schritt, wie in commandref


define Spritpreis HTTPMOD http://www.oeamtc.at/spritapp/ShowGasStation.do?spritaction=show&gsid=1208465 10
>>> passt

attr Spritpreis reading01Name Diesel1 >>> passt

attr Spritpreis reading01Regex .*Diesel[^,]*(\d,\d{3}).*\sheute,\s*(\d{2}:\d{2}).*
>>> passt auch, das Kommando wurde akzeptiert

jedoch erscheint kein Reading mit dem Namen Diesel1 und wird auch im Eventlog als unbekannt vermerkt
2016.11.19 11:48:30 3 : Spritpreis: Read response to update didn't match any Reading

was fehlt noch oder was mache ich falsch?
Titel: Antw:regex Kenner gesucht
Beitrag von: papa am 19 November 2016, 12:00:42
Soweit ich das verstehe, darf es nur einen Match pro Reading geben. Mehr macht ja auch keinen Sinn.

Probiere mal:


attr Spritpreis reading01Name Diesel1
attr Spritpreis reading01Regex .*Diesel[^,]*(\d,\d{3})
attr Spritpreis reading02Name Diesel1Zeit
attr Spritpreis reading02Regex .*Diesel[^,]*\d,\d{3}.*\sheute,\s*(\d{2}:\d{2}).*
Titel: Antw:regex Kenner gesucht
Beitrag von: Prof. Dr. Peter Henning am 19 November 2016, 13:54:08
Ich bleibe dabei: Die Verwendung von XPath ist im Allgemeinen viel einfacher, als das Herumspielen mit regulären Ausdrücken. Siehe nächste Seite

(Edit: JavaScript-Probölem war keines)

LG

pah
Titel: Antw:regex Kenner gesucht
Beitrag von: ramses am 19 November 2016, 14:29:54
@papa: EXCELLENT!  funktioniert! zumindest sehe ich den Preis.

Der 2te Reading erscheint aber nicht, obwohl eingestellt ist!
Ich habe noch immer nicht verstanden, welche Aktion/Trigger genau erstellt den 2ten Reading (Diesel1Zeit).
Anscheinend solange ein Syntaxfehler im RegEx existiert erscheint der Name nicht als Reading. Korrekt?
Titel: Antw:regex Kenner gesucht
Beitrag von: ramses am 19 November 2016, 15:26:53
Ok, funkt alles!
Ich möchte für andere Wiener/Österreicher auch zusammenfassen:

HTTPMOD definieren um stündlich den Preis aktualisiert zu bekommen
http://www.oeamtc.at/spritapp/ShowGasStation.do?spritaction=show&gsid=1208465 3600

Dann folgen die Readings für Diesel (Danke @papa!)

attr Spritpreis reading01Name Diesel
attr Spritpreis reading01Regex .*Diesel[^,]*(\d,\d{3})
attr Spritpreis reading02Name DieselZeit
attr Spritpreis reading02Regex .*\sheute,\s*(\d{2}:\d{2}).*


Analog für Super Benzin
attr Spritpreis reading03Name Super
attr Spritpreis reading03Regex .*Super[^,]*(\d,\d{3})
attr Spritpreis reading04Name SuperZeit
attr Spritpreis reading04Regex .*\sheute,\s*(\d{2}:\d{2}).*


Es sind anscheinend noch Bugs in der Readingsverwaltung, oder zumindest Punkte welche verbessert gehören:
1) Die Readings erscheinen nicht wenn Fehler in RegEx vorhanden sind. >>> da wäre gut eine Benachrichtigung, dass RegEx nicht OK ist.
2) Eine nachträgliche Namensänderung der Readings funktioniert zwar, jedoch die alten werden nicht gelöscht.

Titel: Antw:regex Kenner gesucht
Beitrag von: Prof. Dr. Peter Henning am 19 November 2016, 16:37:59
Öh - und warum liefert mir der ÖAMTC nur JavaScript ?

LG

pah
Titel: Antw:regex Kenner gesucht
Beitrag von: ramses am 19 November 2016, 16:41:50
interessant, kann ich leider nicht sagen.
bei mir funkt zuverlässig. Schon mal in (anderen) Browser probiert?
Titel: Antw:regex Kenner gesucht
Beitrag von: Prof. Dr. Peter Henning am 19 November 2016, 16:59:11
Problem ist einfach mit Geduld zu lösen: Die aktuelle Version des HTTPMOD zeigt wirklich den rohen Puffer an, bevor der JavaScript-Code ausgeführt wurde. Ein paar Sekunden warten, und alles Nötige ist da
Hier die einfachere Lösung mit XPath:

define Spritpreis2 HTTPMOD http://www.oeamtc.at/spritapp/ShowGasStation.do?spritaction=show&gsid=1208465 60
attr Spritpreis2 userattr reading01Name reading01Regex
attr Spritpreis2 enableXPath 1
attr Spritpreis2 reading01Name Diesel
attr Spritpreis2 reading01Regex xpath://tr[td[1]/div/text()="Diesel"]


LG


pah