HTTPMOD bei unbekannter Anzahl Einträge (Zeilen)

Begonnen von Markofu, 29 Dezember 2017, 17:55:17

Vorheriges Thema - Nächstes Thema

Markofu

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








Markofu

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

Markofu

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

StefanStrobel

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

Markofu

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

andi11

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?

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Markofu

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

viegener

Lies noch mal genau durch was ich oben geschrieben habe - es war nicht ger01RegOpt sondern reading01RegOpt!

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Markofu

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

Markofu

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

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Markofu

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


viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können