HTTPMOD & XPath / HTML "well-formed" machen

Begonnen von Nicolas, 18 Juni 2020, 12:26:05

Vorheriges Thema - Nächstes Thema

Nicolas

Hallo Zusammen,

Ich habe versucht per XPath Werte aus einer HTML Seite auszulesen. Der HTML Code ist aber nicht wohlgeformt und entsprechend schlägt der Versuch fehl.

Nun meine Frage: Wie löse ich dieses Problem am Besten? Ist es möglich den HTML Code durch ein Preprocessing aufzuräumen (z.B durch https://metacpan.org/pod/HTML::Tidy)? Wie würde ich dies integrieren?

Danke vielmals für eure Hilfe

Nicolas


===


defmod Zaehler1 HTTPMOD http://192.168.1.20:80/ 30
attr Zaehler1 handleRedirects 1
attr Zaehler1 reading01Name PowerTotal
attr Zaehler1 reading01XPath-Strict /html/body/table/tbody/tr[42]/td[2]/text()



Christoph Morrison

Hallo Nicolas,

Willkommen im Forum! Bitte setze Code in Code-Tags (das ist die # hier über diesem Eingabefeld).
Um dein Problem nachzustellen bräuchten wir mehr Infos, z.B. was http://192.168.1.20:80/ an Output liefert (ggf. anonymisiert).

Gruß
Christoph

MadMax-FHEM

Zitat von: Nicolas am 18 Juni 2020, 12:26:05
Ist es möglich den HTML Code durch ein Preprocessing aufzuräumen (z.B durch https://metacpan.org/pod/HTML::Tidy)? Wie würde ich dies integrieren?

Es gibt das Attribut "preProcessRegex" bei HTTPMOD...

https://forum.fhem.de/index.php/topic,112180.msg1065098.html#msg1065098

EDIT: falls du selbst "wurschteln" willst... Wenn du Unterstützung brauchst/willst (in dem Fall leider nicht von mir ;)  ), dann wie geschrieben: den HTML-Output posten...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Nicolas

Vielen Dank für die Antworten.

Ich konnte das Problem inzwischen beheben. Mein HTML file war kein gültiges XML, da nicht well-formed.

Beispiel zum Reproduzieren (in diesem Fall nicht well-formed, da <head> nicht geschlossen ist).


<html>
<head>
<body>
  <div>1000</div>
</body>
</html>


Nachdem ich die Dokumentation nochmals durchgelesen habe, war die Antwort klar:

reading[0-9]+XPath
defines an xpath to one or more readings when parsing HTML data (see examples below)
reading[0-9]+XPath-Strict
defines an xpath to one or more readings when parsing XML data (see examples below)


reading[0-9]+XPath macht genau was ich wollte. Als erstes wird die HTML Datei in well-formed gemacht (so wie es HTML::Tidy auch machen würde), danach der XPath angewandt. Wenn ich nun also reading01XPath statt reading01XPath-Strict verwende, dann klappt das parsen von einer HTML Datei perfekt.

Viele Grüsse,

Nicolas