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 ?
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.
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"};
}
}
Vielen Dank für die schnelle Antwort. Auf die Idee bin ich gar nicht gekommen... gut, dass ich nachgefragt habe ;)