HTTPMOD Vorschlag, wie ich das am besten auslesen könnte?

Begonnen von Heiner33, 19 Februar 2023, 11:06:51

Vorheriges Thema - Nächstes Thema

Heiner33

Hallo zusammen, ich habe folgende Website, die ich per HTTPMod parsen möchte:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>APCUPSD Full Status Page</title>
</head>
<body>
<blockquote><pre>DATE     : 2023-02-18 20:32:37 +0000 
STATUS   : ONLINE
LINEV    : 234.0 Volts
LOADPCT  : 3.0 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 47.9 Minutes
MBATTCHG : 50 Percent
[...]
</pre></blockquote>
</body></html>


Die Daten liegen also "halbwegs" strukturiert innerhalb des <pre>-Tags vor.
Mit readingXXName und readingXXRegex kann ich auch problemlos an die Werte kommen. Die oben stehende HTML ist aber stark gekürzt, es gibt ca. 50 Werte, die ich jeweils in ein Reading parsen möchte.

Wollte mal nachfragen, ob es da nicht einen "einfacheren" Weg gibt die ganzen Werte zu parsen? Hilfe mir da eventuell die parseFunction1 ?


betateilchen

Man muss nicht alles mit HTTPMOD machen.

Es tun manchmal auch 2 Zeilen Code in einer 99_myUtils.pm


   my ($err,@lines) = FileRead({ FileName => "/tmp/test.html", ForceType => "file" });
   map {Debug "name $1 value: $2" if ($_=~m/(.*):(.*)/)} @lines;


in /tmp/test.html habe ich Deinen HTML-Code gepackt, um das testen zu können.
Als Ergebnis kommt:


2023.02.19 11:23:33 1: DEBUG>name   "http value: //www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2023.02.19 11:23:33 1: DEBUG>name <html xmlns="http://www.w3.org/1999/xhtml" xml value: lang="en">
2023.02.19 11:23:33 1: DEBUG>name <blockquote><pre>DATE     : 2023-02-18 20:32 value: 37 +0000 
2023.02.19 11:23:33 1: DEBUG>name STATUS    value:  ONLINE
2023.02.19 11:23:33 1: DEBUG>name LINEV     value:  234.0 Volts
2023.02.19 11:23:33 1: DEBUG>name LOADPCT   value:  3.0 Percent
2023.02.19 11:23:33 1: DEBUG>name BCHARGE   value:  100.0 Percent
2023.02.19 11:23:33 1: DEBUG>name TIMELEFT  value:  47.9 Minutes
2023.02.19 11:23:33 1: DEBUG>name MBATTCHG  value:  50 Percent


Anstatt Debug() könnte man natürlich auch setreading verwenden, um die Werte als reading in ein device zu schreiben.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#2
Hier noch die Variante inklusive des Filterns der nicht benötigten Zeilen.


sub html_test{
   my ($err,@lines) = FileRead({ FileName => "/tmp/test.html", ForceType => "file" });
   foreach my $l (@lines){
      $l =~ s/^<blockquote><pre>//;
      next unless $l =~ m/^[A-Z]/;
      if ( $l =~ m/(.*):(.*)/ ) {Debug "name: $1 value: $2"};
   }
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Heiner33

Vielen Dank für die schnelle Antwort. Auf die Idee bin ich gar nicht gekommen... gut, dass ich nachgefragt habe ;)