Hauptmenü

regex Kenner gesucht

Begonnen von ramses, 10 November 2016, 21:40:05

Vorheriges Thema - Nächstes Thema

ramses

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!

Wuppi68

such mal nach Benzin oder Spritpreis Monitor

da gibt es schon "fertiges" das funktioniert
FHEM unter Proxmox als VM

papa

BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Wuppi68

FHEM unter Proxmox als VM

ramses

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) 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?


papa


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


Die erste Gruppe matched den Preis, die zweite die Uhrzeit.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Prof. Dr. Peter Henning

Ich schlage vor, stattdessen bei diesem Modul mit XPath zu arbeiten - das ist viel einfacher.

LG

pah

ramses

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?

Prof. Dr. Peter Henning

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

ramses

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...

Prof. Dr. Peter Henning

Na, dann schlage ich doch mal vor, die Commandref zum Modul HTTPMOD zu lesen.

LG

pah

ramses

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?

papa

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}).*
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Prof. Dr. Peter Henning

#13
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

ramses

@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?