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"> </td><td class="list" align="center"> </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"> </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"> </td><td class="list" align="center"> </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"> </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"> </td><td class="list" align="center"> </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"> </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"> </td>
<td class="list" align="center"> </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
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
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
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
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
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?
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
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
Lies noch mal genau durch was ich oben geschrieben habe - es war nicht ger01RegOpt sondern reading01RegOpt!
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
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
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
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
http://wiki.selfhtml.org/wiki/Regul%C3%A4rer_Ausdruck
https://perldoc.perl.org/perlre.html
https://regex101.com/
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)
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
Hallo,
vielen Dank.
tr class[^<]+<td[^<]+<b>[\w,\s]*9Fa[\w,]*<\/b>(.*)
das wars :-)
Gruß marko