FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Markofu am 29 Dezember 2017, 17:55:17

Titel: HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 29 Dezember 2017, 17:55:17
Hallo an die Profis hier,
ich habe gerade angefangen mich mit HTTPMOD zu beschäftigen. Ich möchte gern den Vertretungsplan meines Sohes auswerten, da in diesem täglich Änderungen erscheinen und er andere Bücher einpacken muß. Diese Änderungen würde ich mir dann per Telegram zusenden. Telegram läuft schon :-)

Es Handelt sich um folgende zwei Seiten.
http://plan.ernestinum-celle.de/Schueler/subst_001.htm
http://plan.ernestinum-celle.de/Schueler/subst_002.htm

Der Aufbau ist leider ohne ID´s
Ich würde nur gern die Zeilen auswerten, wo in der Spalte Klasse"6c" vorkommt. Das kann entweder allein (6c) oder (6c-6d) oder (6a,6b,6c) sein. Wir können auch gern zum testen die Klasse "9Fn" nehmen die kommt mehrmals auf beiden Plänen vor.

Das Datum und Tag zu ermitteln ist ja recht einfach, aber wie kann ich weitermachen? Mir fehlen die Ideen. Wie bekomme ich dann einzelne readings für jedes Feld in der entsprechenden Zeile ???

Hier mal ein Auszug des Quelltext der Seite.

<div class="mon_title">21.12.2017 Donnerstag</div>
<tr class='list odd'><td class="list" align="center"><b>8L2</b></td><td class="list" align="center"><b>5</b></td><td class="list" align="center"><b>Ba</b></td><td class="list" align="center"><b>Ph</b></td><td class="list" align="center"><b>74</b></td><td class="list" align="center">Vertretung</td><td class="list" align="center">Bio ep1</td><td class="list" align="center">&nbsp;</td><td class="list" align="center">&nbsp;</td></tr>
<tr class='list even'><td class="list" align="center"><b>9Fa</b></td><td class="list" align="center"><b>3</b></td><td class="list" align="center"><b>Ts</b></td><td class="list">&nbsp;</td><td class="list" align="center"><b>06</b></td><td class="list" align="center">Vertretung</td><td class="list" align="center">Bio</td><td class="list" align="center">&nbsp;</td><td class="list" align="center">&nbsp;</td></tr>
<tr class='list odd'><td class="list" align="center"><b>9Fa</b></td><td class="list" align="center"><b>4</b></td><td class="list" align="center"><b>vB</b></td><td class="list" align="center"><b>PoWi</b></td><td class="list" align="center"><b>135</b></td><td class="list" align="center">.</td><td class="list" align="center">PoWi</td><td class="list">&nbsp;</td><td class="list" align="center">dauerhafter Raumwechsel</td></tr>
<tr class='list even'><td class="list" align="center"><b>9Fn</b></td><td class="list" align="center"><b>2</b></td><td class="list" align="center"><b>Ts</b></td><td class="list" align="center"><b>En</b></td><td class="list" align="center"><b>81</b></td><td class="list" align="center">Vertretung</td><td class="list" align="center">Bio</td><td class="list" align="center">&nbsp;</td><td class="list" align="center">&nbsp;</td></tr>
<tr class='list odd'><td class="list" align="center"><b>9Fn</b></td><td class="list" align="center"><b>4</b></td><td class="list" align="center"><b>Ts</b></td><td class="list" align="center"><b>En</b></td><td class="list" align="center"><b>81</b></td><td class="list" align="center">Tausch</td><td class="list" align="center">PoWi</td><td class="list" align="center">Mi-20.12. / 3</td><td class="list" align="center">&nbsp;</td></tr>

Die Zeile die ich z.B. suche Lautet mit Beispiel der Klasse "9Fn" etwas deutlicher formatiert.
<tr class='list even'>
<td class="list" align="center"><b>9Fn</b></td>
<td class="list" align="center"><b>2</b></td>
<td class="list" align="center"><b>Ts</b></td>
<td class="list" align="center"><b>En</b></td>
<td class="list" align="center"><b>81</b></td>
<td class="list" align="center">Vertretung</td>
<td class="list" align="center">Bio</td>
<td class="list" align="center">&nbsp;</td>
<td class="list" align="center">&nbsp;</td>
</tr>

Wie bekomme ich jetzt die restlichen Sachen weg so das ich nur die Daten mit einem Trenner bekomme?

Vielen Dank schon mal

Gruß Marko







Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 30 Dezember 2017, 06:25:33
Hallo,
hat keiner eine Idee? Ich such schon einige Tage in Foren und bei Goggle aber ich komme leider mit der Syntax noch nicht klar.

Bitte helft mir !!

Gruß Marko
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 30 Dezember 2017, 16:17:37
Hallo,

ich nochmal.

Habe ich die Frage an einer falschen Stelle gestellt? Ist es zu schwer oder zu einfach oder kann ich es mit HTTPMOD nicht lösen?

Über einen Tipp würde ich mich sehr freuen.

Gruß Marko
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: StefanStrobel am 01 Januar 2018, 20:21:50
Hallo Marko,

wenn Du mehrere Treffer für eine Regex verarbeiten möchtest, geht das z.B. mit regopt g.
Leider verstehe ich aber nicht was Du genau erreichen möchtest bzw. welche Daten Du in welchem Reading haben möchtest.
Wenn Dir regopt nicht weiter hilft, dann könntest Du Dir auch eine eigene Parse-Funktion in HTTPMOD einklinken.
So oder so musst Du Dich entweder mit regulären Ausdrücken oder mit Perl beschäftigen.

Gruss
   Stefan
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 02 Januar 2018, 09:19:53
Hallo SrefanStrobel,

vielen Dank für deine Antwort. Vieleicht habe ich mich ja nicht richtig ausgedrückt. Sorry

Wie gesagt ist es ein Vertretungsplan. Manchmal gibt es keinen  und manchmal mehrere Einträge (Zeilen in der Tabelle) die auf die Klasse zutreffen. Ich möchte dann gern die Daten aus den Spalten Vertreter Stunde usw ..... für die entsprechende Klasse als Readings speichern (Mehrere Zeilen möglich). Im Anschluß eine Benachrichtigung schicken sobald ein neuer Eintrag für die gesuchte Klasse hinzugekommen ist.

Das Ich mit Perl beschäftigen muß ist mir klar aber ich finde halt nicht den richtigen Start deshalb habe ich hier gepostet.

Gruß Marko
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: andi11 am 02 Januar 2018, 09:29:27
Zitat von: Markofu am 29 Dezember 2017, 17:55:17
Das Datum und Tag zu ermitteln ist ja recht einfach, aber wie kann ich weitermachen?
Wie machst du es denn da?
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: viegener am 02 Januar 2018, 12:19:02
Ich versuche mal einen ersten Teil beizutragen: Ich würde das in mehreren Schritten machen erstmal ein Reading pro Zeile die für Dich passt:


Lege mal ein httpmod an mit folgenden Attributen:


reading01Name zeile
reading01RegOpt g
reading01Regex tr class[^<]+<td[^<]+<b>9Fn(.*)


Als Ergebnis bekommst Du pro Zeile ein Reading mit den Einträgen für die Klasse 9Fn

Diese kannst Du dann weiter aufspalten in verschiedene Readings (entweder über verschiedene Regex/Readings) oder indem Du mehrere Capturegroups anlegst
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 03 Januar 2018, 09:23:07
Hallo viegener,

vielen Dank für deinen Tipp.
Leider bekomme ich ja auch nur eine Zeile. Das Datum finde ich und es ist O.K. Nur bei den Zeilen habe ich meine Probleme wenn es mehrere sind die zutreffend sind.

Attributes:
   enableControlSet 1
   get01RegOpt g
   reading01Name Klasse
   reading01Regex tr class[^<]+<td[^<]+<b>9Fn(.*)
   reading02Name Datum
   reading02Regex <div class="mon_title">(.*)</div>
   room       Ernestinum
   stateFormat Klasse 9Fn
   timeout    5
   userattr   get01RegOpt reading01Name reading01Regex reading02Name reading02Regex


Gruß Marko
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: viegener am 03 Januar 2018, 09:58:14
Lies noch mal genau durch was ich oben geschrieben habe - es war nicht ger01RegOpt sondern reading01RegOpt!

Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 03 Januar 2018, 10:44:44
Hallo viegener,

wer lesen kann ist klar im Vorteil :-)

Es klappt ! Super und jetzt muß ich nur noch die Formatierungen der Tabelle wegfiltern und dann kann ich damit etwas anfangen.

Vielen vielen Dank !!!

Gruß Marko
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 04 Januar 2018, 01:12:16
Hallo viegener,

es klappt schon ganz gut nur eine Tipp bräuchte ich noch. In der Klasse können ja mehrere stehen.

bei "9Fn"  ==> tr class[^<]+<td[^<]+<b>9Fn(.*)  => klappt es
bei "9Fn,9Fa"  ==> tr class[^<]+<td[^<]+<b>9Fn(.*)  => klappt es

bei "9Fa,9Fn" ==> tr class[^<]+<td[^<]+<b>(.*)9Fa(.*) => bekomme ich zu viel
bei einem tr class[^<]+<td[^<]+<b>(.*)9Fa(.*)</b>(.*) =>kommt nichts

Gruß Marko
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: viegener am 04 Januar 2018, 10:52:02
Ich denke Du musst Dich schon mit HTTPMOD unf regexp befassen - einfach nur (.*) irgendwo hinzufügen bringt doch gar nichts.

Wenn es Einträge gibt die mehrere Klassen enthalten, so muss ja ein Ausdruck her der zwischen <b> und </b> die richtige Klasse findet.

reading01Regex tr class[^<]+<td[^<]+<b>[\w,]*9Fn[\w,]*</b>(.*)

Vielleicht passt ja das, ohne dass ich es ausproboert hätte.

Aber wie gesagt, das ist keine einfache Aufgabe und ohne Einarbeiten in HTTPMOD (was bedeutet die Klammer in Regexp) und Regexp selbst wirst Du das nicht lösen können
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 04 Januar 2018, 12:45:23
Hallo,
vielen Dank. Es funktioniert leider nicht.

Zu welchen Seiten kannst du mir denn raten, wenn es geht in deutsch. Ich wollte es schnell zum laufen bekommen, da die Ferien bald zuende sind aber dann dauert es halt etwas länger.

Gruß Marko
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: dev0 am 04 Januar 2018, 12:51:09
http://wiki.selfhtml.org/wiki/Regul%C3%A4rer_Ausdruck
https://perldoc.perl.org/perlre.html
https://regex101.com/
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: viegener am 04 Januar 2018, 13:12:56
Leider ist die selfhtml-Seite für regexp nur noch für javascript und nicht mehr für perl
Das angebot wird da leider dünner - aber die self-html-Seite ist noch über webarchive verfügbar:

https://web.archive.org/web/20170402184254/https://wiki.selfhtml.org/wiki/Perl (https://web.archive.org/web/20170402184254/https://wiki.selfhtml.org/wiki/Perl)
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: viegener am 04 Januar 2018, 13:25:41
Dann versuch es mal hiermit:

reading01Regex tr class[^<]+<td[^<]+<b>[\w,]*9Fn[\w,]*<\/b>(.*)

Es fehlte ein escpae Zeichen für den /

Übrigens: "Es funktioniert leider nicht" ist nicht so sehr informativ - wenn Du die entsprechende Fehlermeldung aus dem log holst machst Du es anderen einfacher
Titel: Antw:HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)
Beitrag von: Markofu am 05 Januar 2018, 08:04:03
Hallo,
vielen Dank.
tr class[^<]+<td[^<]+<b>[\w,\s]*9Fa[\w,]*<\/b>(.*)

das wars :-)



Gruß marko