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!
such mal nach Benzin oder Spritpreis Monitor
da gibt es schon "fertiges" das funktioniert
RegEx lassen sich hier http://www.regexe.de/ (http://www.regexe.de/) gut testen.
hier https://forum.fhem.de/index.php/topic,22554.0/topicseen.html ist der Link dahin
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?
.*Diesel[^,]*(\d,\d{3}).*\sheute,\s*(\d{2}:\d{2}).*
Die erste Gruppe matched den Preis, die zweite die Uhrzeit.
Ich schlage vor, stattdessen bei diesem Modul mit XPath zu arbeiten - das ist viel einfacher.
LG
pah
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?
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
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...
Na, dann schlage ich doch mal vor, die Commandref zum Modul HTTPMOD zu lesen.
LG
pah
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?
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}).*
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
@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?
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.
Öh - und warum liefert mir der ÖAMTC nur JavaScript ?
LG
pah
interessant, kann ich leider nicht sagen.
bei mir funkt zuverlässig. Schon mal in (anderen) Browser probiert?
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