Regex um FHEM zu töten?!

Begonnen von Floriky, 17 Dezember 2020, 23:21:10

Vorheriges Thema - Nächstes Thema

Floriky

Hallo Zusammen,

bitte entschuldigt den reißerischen Titel. Wage mich gerad an das Thema HTTPMOD und wollte als Übungsaufgabe die Wochenkarte des ortsansässigen Metzgers auslesen.

Ein List des Devices:

defmod Poferl HTTPMOD https://metzgerei-poferl.de/wp-json/wp/v2/pages 20000
attr Poferl DbLogExclude .*
attr Poferl enableControlSet 1
attr Poferl enableCookies 1
attr Poferl reading01JSON 01_content_rendered
attr Poferl reading01Name 01_content_rendered

setstate Poferl 2020-12-17 23:17:16 01_content_rendered <h1>Unser Speiseplan</h1>\
<h1>vom Mo.14.12.2020 bis Fr.25.12.2020.</h1>\
<p>Ab Montag, den 02.11.2020 dürfen wir auf Grund der aktuellen Lage nur noch</p>\
<p>Essen zum mitnehmen anbieten. Der Verzehr in unseren Räumlichkeiten ist</p>\
<p>NICHT gestattet !! Wir bitten um Ihr Verständnis und liefern natürlich auch</p>\
<p>ohne Aufpreis zu Ihnen nach Hause, oder in die Firma.</p>\
<table style="width: 100%;; height: 1010px;;">\
<thead>\
<tr style="height: 105px;;">\
<th style="width: 17.2414%;; height: 105px;;"></th>\
<th style="width: 39.6552%;; height: 105px;;">\
<h2>Menü 1</h2>\
<p><span style="color: #cc0000;; font-size: x-large;;">€ 5,75</span></th>\
<th style="width: 42.931%;; height: 105px;;">\
<h2>Menü 2</h2>\
<p><span style="color: #cc0000;; font-size: x-large;;">€ 6,75</span></th>\
</tr>\
</thead>\
<tbody>\
<tr style="height: 68px;;">\
<th style="width: 17.2414%;; height: 68px;;">Montag 14.12.</th>\
<td style="width: 39.6552%;; height: 68px;;">Kartoffel-Kassler-Auflauf</p>\
<p>mit gemischtem Blattsalat</td>\
<td style="width: 42.931%;; height: 68px;;">Paniertes Putenschnitzel mit Beilagen Ihrer Wahl und gemischtem Blattsalat</td>\
</tr>\
<tr style="height: 118px;;">\
<th style="width: 17.2414%;; height: 118px;;" bgcolor="#585858">Dienstag 15.12.</th>\
<td style="width: 39.6552%;; height: 118px;;" bgcolor="#585858">Currywurst mit Pommes , deftige Currysoße und dazu gemischten Blattsalat</td>\
<td style="width: 42.931%;; height: 118px;;" bgcolor="#585858">Rahmgeschnetzeltes vom Kalb mit Beilagen Ihrer Wahl und gedämpftem Gemüse</td>\
</tr>\
<tr style="height: 121px;;">\
<th style="width: 17.2414%;; height: 121px;;">Mittwoch 16.12.</th>\
<td style="width: 39.6552%;; height: 121px;;">Allgäuer Pilzpfanne mit Hähnchenstreifen und gemischtem Blattsalat</td>\
<td style="width: 42.931%;; height: 121px;;">gefüllte Kohlrouladen mit Beilagen Ihrer Wahl und gemischtem Blattsalat</td>\
</tr>\
<tr style="height: 119px;;">\
<th style="width: 17.2414%;; height: 119px;;" bgcolor="#585858">Donnerstag 17.12.</th>\
<td style="width: 39.6552%;; height: 119px;;" bgcolor="#585858">Gyros-Pfanne mit Zwiebeln und Tzatziki, dazu hausgemachten Krautsalat</td>\
<td style="width: 42.931%;; height: 119px;;" bgcolor="#585858">gefüllte Rinderrouladen mit Beilagen Ihrer Wahl und Rotkraut</td>\
</tr>\
<tr style="height: 95px;;">\
<th style="width: 17.2414%;; height: 95px;;">Freitag 18.12.</th>\
<td style="width: 39.6552%;; height: 95px;;">Puten-Paprikagulasch mit  Beilagen Ihrer Wahl, dazu gemischten Salat</td>\
<td style="width: 42.931%;; height: 95px;;">Wirtshausschnitzel mit Beilagen Ihrer Wahl und gemischtem Salat</td>\
</tr>\
</tbody>\
<tbody>\
<tr style="height: 25px;;">\
<th style="width: 17.2414%;; height: 25px;;" bgcolor="#FF0040"></th>\
<td style="width: 39.6552%;; height: 25px;;" bgcolor="#FF0040"></td>\
<td style="width: 42.931%;; height: 25px;;" bgcolor="#FF0040"></td>\
</tr>\
<tr style="height: 77px;;">\
<th style="width: 17.2414%;; height: 77px;;">Montag 21.12.</th>\
<td style="width: 39.6552%;; height: 77px;;">Gemüsereispfanne mit Hähnchenstreifen und gemischtem Salat</td>\
<td style="width: 42.931%;; height: 77px;;">Paniertes Seelachsfilet mit Remouladensoße, Beilagen Ihrer Wahl und gemischtem Blattsalat</td>\
</tr>\
<tr style="height: 77px;;">\
<th style="width: 17.2414%;; height: 77px;;" bgcolor="#585858">Dienstag 22.12.</th>\
<td style="width: 39.6552%;; height: 77px;;" bgcolor="#585858">Tortellini "; Carbonara"; , dazu gemischten Salat</td>\
<td style="width: 42.931%;; height: 77px;;" bgcolor="#585858">Hähnchenbrustfilet in Sahnesoße, Beilagen Ihrer Wahl und Rahmgemüse</td>\
</tr>\
<tr style="height: 77px;;">\
<th style="width: 17.2414%;; height: 77px;;">Mittwoch 23.12.</th>\
<td style="width: 39.6552%;; height: 77px;;">Gulaschtopf mit Fleisch&amp;;Wurststückchen, dazu gemischten Blattsalat</td>\
<td style="width: 42.931%;; height: 77px;;">Krustenbraten aus dem Backofen, Beilagen Ihrer Wahl und gemischtem Blattsalat</td>\
</tr>\
<tr style="height: 51px;;">\
<th style="width: 17.2414%;; height: 51px;;" bgcolor="#585858">Donnerstag 24.12.</th>\
<td style="width: 39.6552%;; height: 51px;;" bgcolor="#585858">Heiligabend</td>\
<td style="width: 42.931%;; height: 51px;;" bgcolor="#585858">Heiligabend</td>\
</tr>\
<tr style="height: 77px;;">\
<th style="width: 17.2414%;; height: 77px;;">Freitag 25.12.</th>\
<td style="width: 39.6552%;; height: 77px;;">1. Weihnachtsfeiertag</td>\
<td style="width: 42.931%;; height: 77px;;">1. Weihnachtsfeiertag</td>\
</tr>\
</tbody>\
</table>\




Sobald ich das Attribut
attr Poferl reading01Regex (?:>Montag.*[\S\s]*?<td.*">?)(.*)(?:<\/.*>)

abspeicehre und ein reread durchführe hängt sich fhem auf. Kann mir jemand sagen was ich falsch machen?


Vielen Dank vorab und bleibt gesund!

Christoph Morrison


ch.eick

Moin,
ich habe mir nur das html angesehen und stochere man im Nebel.
Eventuell könnten die ";;" Schwierigkeiten machen?
Hast Du die Regex bei den bekannten Diensten im Netz mal getestet?
Gruß
   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

yersinia

Ja, das kann passieren wenn man RegEx unklug setzt. ;)

Aber der Link erzeugt doch ein JSON, wäre dann das JsonMod Modul (weitere Beispiele) vielleicht eher geeignet für dich?
viele Grüße, yersinia
----
FHEM 6.3 (SVN) on RPi 4B with RasPi OS Bullseye (perl 5.32.1) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

Christoph Morrison

#4
Ich würde das ja, um nur die Nutzdaten (das Menü) zu beziehen, XPath statt RegEx nehmen. Mit JsonMod bekäme man auch erstmal nur das gesamte Menü, da die Daten ja an sich nur unstrukturiert vorliegen und darauf dann JsonPath nicht funktioniert.

Der vom OP verwendete Regex performt auch nicht wirklich gut, 380ms mit etwa 6000 Steps ist ordentlich.

Floriky

#5
Hallo Zusammen, erstmal vielen Dank für eure Hilfe!

Zitat von: Christoph Morrison am 18 Dezember 2020, 08:13:13
Was steht denn im Log?

Außer
2020.12.18 00:26:22 3: Poferl: Read callback: Error: read from https://metzgerei-poferl.de:443 timed out
2020.12.18 00:26:22 1: Connection refused from 192.168.2.130:53812


leider nicht viel, Christoph.


Zitat von: ch.eick am 18 Dezember 2020, 08:15:18
Moin,
ich habe mir nur das html angesehen und stochere man im Nebel.
Eventuell könnten die ";;" Schwierigkeiten machen?
Hast Du die Regex bei den bekannten Diensten im Netz mal getestet?
Gruß
   Christian

Hallo Christian, ja habe ich und da hat das problemlos funktioniert. Wenn ich nur Teile der Regex nehme, klappt das alles wunderbar aber nicht die gesamte.


Zitat von: yersinia am 18 Dezember 2020, 09:09:05
Ja, das kann passieren wenn man RegEx unklug setzt. ;)

Aber der Link erzeugt doch ein JSON, wäre dann das JsonMod Modul (weitere Beispiele) vielleicht eher geeignet für dich?

Hallo yersinia, ja werde mir mal das näher anschauen. Habe bisher mit beiden Modulen wenig bis keine Erfahrung. Aber vielen Dank schonmal!


Zitat von: Christoph Morrison am 18 Dezember 2020, 09:31:08
Ich würde das ja, um nur die Nutzdaten (das Menü) zu beziehen, XPath statt RegEx nehmen. Mit JsonMod bekäme man auch erstmal nur das gesamte Menü, da die Daten ja an sich nur unstrukturiert vorliegen und darauf dann JsonPath nicht funktioniert.

Der vom OP verwendete Regex performt auch nicht wirklich gut, 380ms mit etwa 6000 Steps ist ordentlich.

Hallo Christoph, werde ich versuchen. Mal sehen wie weit ich komme. Erstmal vielen Dank!



Zitat von: Jamo am 18 Dezember 2020, 09:41:57
Hallo Floriky,
ich habe exact das von Dir beschriebene Verhalten (fhem hängt, der Perl prozess ist bei 100%) auch schon mal bei einem von mir verwendetem HTTPMOD für das Fernsehprogramm von Hoerzu.de gehabt. Direkt nach einem reread hat fhem sich wiederholbar aufgehängt. Geholfen hat dann nur die Source deiner Seite auf 101.regexp.com zu kopieren, und die Regexp vollstaendig zu checken. Ohne das ich es probiert habe: Du kannst mal probieren, das [\S*\s*]*? durch \X*? zu ersetzen. Gruss, Jamo

Danke für den Tipp, Jamo. Habe die Regex auf 101.regexp.com zusammengebaut. Und dort funktioniert sie (zumindest mit dem Text aus meinem Reading 01_content_rendered sehr gut. Das Austauschen werde ich gleich mal Testen! Vielen Dank!
EDIT: Also der Tauschen von [\S*\s*]*? durch \X*? bringt leider nichts. Fhem stürzt immer noch ab. 



Floriky

Also so langsam glaube ich, das liegt an der geladenen JSON. Denn auch mit dem JsonMod- Modul habe ich die selben Probleme. Würde es einen besseren Weg geben die Tabelle mit Tagesgerichten von der Webseite zu bekommen. Hatte den Link auf die JSON aus einem Javascript über das Devtool von Chrome.

Floriky


Zitat von: Christoph Morrison am 18 Dezember 2020, 09:31:08
Ich würde das ja, um nur die Nutzdaten (das Menü) zu beziehen, XPath statt RegEx nehmen. Mit JsonMod bekäme man auch erstmal nur das gesamte Menü, da die Daten ja an sich nur unstrukturiert vorliegen und darauf dann JsonPath nicht funktioniert.

Verstehe aktuell nicht wie hier den XPath zu bauen habe. Geht das überhaupt mit dem HTML-Code?

Christoph Morrison

Zitat von: Floriky am 18 Dezember 2020, 17:11:46
Also so langsam glaube ich, das liegt an der geladenen JSON. Denn auch mit dem JsonMod- Modul habe ich die selben Probleme. Würde es einen besseren Weg geben die Tabelle mit Tagesgerichten von der Webseite zu bekommen. Hatte den Link auf die JSON aus einem Javascript über das Devtool von Chrome.

Ja, XPath auf die HTML-Quelle. Welche Daten genau willst du denn beziehen?

In //article/h1[2] findest du z.B. die Gültigkeit,
unter //article/table/tbody[1]/tr[1]/th dann Montag 14.12.
usw.

Das Developer-Menü in Chrome liefert dir im Prinzip jeden XPath.


2020.12.18 00:26:22 3: Poferl: Read callback: Error: read from https://metzgerei-poferl.de:443 timed out
2020.12.18 00:26:22 1: Connection refused from 192.168.2.130:53812


Bitte setze mal

attr global verbose 5
attr global stacktrace 1

Floriky

#9
Zitat von: Christoph Morrison am 18 Dezember 2020, 17:42:56

Bitte setze mal

attr global verbose 5
attr global stacktrace 1



Also habs mal für dich durlaufen lassen. Lustigerweise hat er sich nicht dabei aufgehängt. Am Ende des Ausschnitts sieht man aber, dass zwischen den beiden Einträgen fast 2 Minuten liegen. Der Ausschnitt ist zu lang. Häng ihn als Datei mit an.


Floriky

Zitat von: Christoph Morrison am 18 Dezember 2020, 17:42:56
Ja, XPath auf die HTML-Quelle. Welche Daten genau willst du denn beziehen?

In //article/h1[2] findest du z.B. die Gültigkeit,
unter //article/table/tbody[1]/tr[1]/th dann Montag 14.12.
usw.

Das Developer-Menü in Chrome liefert dir im Prinzip jeden XPath.

Also wenn ich den XPath so speichere, bekomme ich kein Reading. Das Prinzip hat sich mir jedoch jetzt erschlossen. Dafür schonmal vielen Dank. Du meinst im DevTool dann wahrscheinlich den normalen "HTML-Baum" unter "Elements".  Oder?

Hier mal ein List mit XPath:
defmod Poferl HTTPMOD https://metzgerei-poferl.de/aktuelle-mittagsmenues_blank 20000
attr Poferl DbLogExclude .*
attr Poferl enableControlSet 1
attr Poferl enableCookies 1
attr Poferl enableXPath 1
attr Poferl reading01Name 01_content_rendered
attr Poferl reading01XPath //article/table/tbody[1]/tr[1]/th




Mit deiner HTML-Quelle funktioniert aber die Regex auch einwandfrei. Wie bist du auf diese "Blank-Url" gekommen?

Christoph Morrison

Zitat von: Floriky am 18 Dezember 2020, 18:18:54
Also wenn ich den XPath so speichere, bekomme ich kein Reading.

Ich habe die Ausdrücke gerade noch mal mit einer Kopie deines HTTPMOD-Devices versucht und ja, ich bekomme da auch kein Reading. Erstmal läuft die Seite ständig in einen Timeout, zweitens scheint mein XPather mit dem defekten Quelltext vom Poferl nicht klar zu kommen. Schade.

ZitatDas Prinzip hat sich mir jedoch jetzt erschlossen. Dafür schonmal vielen Dank. Du meinst im DevTool dann wahrscheinlich den normalen "HTML-Baum" unter "Elements".  Oder?

Wenn du einen Kontext-Klick (also rechts z.B.) auf ein Element machst, kannst du unter "Copy" dir einen XPath-Ausdruck in die Zwischenablage legen.

ZitatMit deiner HTML-Quelle funktioniert aber die Regex auch einwandfrei. Wie bist du auf diese "Blank-Url" gekommen?

Die ist in der JSON-Quelle verlinkt, aber wird auch angezeigt wenn man sich die Header anschaut.

Geh doch mal hin und sag ihm, dass du keine Wurst kaufen würdest, die gemacht ist wie der Quelltext auf der Seite ;-)

Floriky

Zitat von: Christoph Morrison am 18 Dezember 2020, 18:43:42
Ich habe die Ausdrücke gerade noch mal mit einer Kopie deines HTTPMOD-Devices versucht und ja, ich bekomme da auch kein Reading. Erstmal läuft die Seite ständig in einen Timeout, zweitens scheint mein XPather mit dem defekten Quelltext vom Poferl nicht klar zu kommen. Schade.

Okay, dann lag es nicht nur an mir. Hab mir extra ein Browser-AdOn installiert, dass das können sollte, aber das hat auch immer nur den kaputten Queltext bemängelt.  ;)

Zitat von: Christoph Morrison am 18 Dezember 2020, 18:43:42
Wenn du einen Kontext-Klick (also rechts z.B.) auf ein Element machst, kannst du unter "Copy" dir einen XPath-Ausdruck in die Zwischenablage legen.

Vielen Dank! Solche Tipps sind Goldwert! Klappt wunderbar!

Zitat von: Christoph Morrison am 18 Dezember 2020, 18:43:42
Geh doch mal hin und sag ihm, dass du keine Wurst kaufen würdest, die gemacht ist wie der Quelltext auf der Seite ;-)

Ja der Quellcode ist nicht das Einzigste, dass bei dem Guten nicht stimmt....  :-X

amenomade

#13
Die Regex
(?:>Montag.*[\S\s]*?<td.*">?)(.*)(?:<\/.*>)
führt zu katastrophales Backtracking. Kein Wunder, dass FHEM abstürzt.

Versuche einfach mit:
>Montag.*?<td.*?">(.*?)<

EDIT: und falls Du beide Gerichte willst:
>Dienstag.*?<td.*?">(.*?)<.*?td.*?">(.*?)<

reading01JSON ist hier überflüssig, wenn Du reading01Regex definierst.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Floriky

Zitat von: amenomade am 19 Dezember 2020, 02:45:22
Die Regex
(?:>Montag.*[\S\s]*?<td.*">?)(.*)(?:<\/.*>)
führt zu katastrophales Backtracking. Kein Wunder, dass FHEM abstürzt.

Vielen Dank für den Link. Werde mit das gleich mal durchlesen. Habe mir schon gedacht, dass jemand mit Ahnung wahrscheinlich die Hände über dem Kopf zusammenschlägt...  ;D

Zitat von: amenomade am 19 Dezember 2020, 02:45:22
Versuche einfach mit:
>Montag.*?<td.*?">(.*?)<

EDIT: und falls Du beide Gerichte willst:
>Dienstag.*?<td.*?">(.*?)<.*?td.*?">(.*?)<

Habe die Regex auf regex101 getestet. Aber sie bringen leider kein Match.....