Thread HTML mit Perl regex parsen (9 answers)
Opened by Lauvia at 2013-09-06 12:50

Linuxer
 2013-09-10 11:44
#170066 #170066
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Was passiert denn, wenn der Block enthalten ist?
Lediglich nicht das Erwartete? Oder werden Fehler oder Warnungen ausgegeben? Wenn ja welche?

Auffällig bei der relevanten Datentabelle ist, dass da sowohl positive wie auch negative Zahlen auftauchen, mal als Integer, mal als Gleitkommazahl. Das musst Du natürlich berücksichtigen! Wofür steht das /d in einem Regex? Und was soll das [^']+? An einigen Stellen, wo Du das verwendest, erkenne ich dafür keinen Sinn. Weißt Du, wofür das [^']+ steht?

Dringend empfohlene Lektüre:
http://perldoc.perl.org/perlretut.html
http://perldoc.perl.org/perlrequick.html
http://perldoc.perl.org/perlre.html


Setze Dich bitte dringend damit auseinander, wie Regex funktionieren und welche Bedeutung die Zeichen und Konstrukte haben. Es hilft Dir nicht, die Bruchstücke scheinbar ahnungslos aus den gegebenen Code-Beispielen zusammenzuklauben und zusammenzuschmeissen.

Ich hätte den Regex z.B. über mehrere Zeilen erstellt (wie schon zuvor gezeigt), damit bleibt er übersichtlicher und man kann ihm Kommentare und Struktur geben (wie schon mal gezeigt).
Erläuterungen dazu finden sich in der verlinkten Dokumentation.

Sorry, dass ich Dir jetzt mal spontan keinen Code liefer.

Ich würde ein Testskript erstellen, um den Regex aufzubauen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Useqq = 1;

# Baue den Regex nach und nach auf
my $regex = qr{
  class='([^']+)'                # Klasse einfangen
  .*?
  # TODO: Bus value einfangen
  # TODO: ECU value einfangen
  # TODO: Deviation einfangen
}x;


my $i = 0;
while ( my $line = <DATA> ) {
        if ( my @result = $line =~ $regex ) {
                print Dumper( \@result );
        }
        else {
                warn "No match for: $line";
        }
}

__DATA__
<TR><TH>Bus Signal</TH><TH>Bus Value</TH><TH>ECU Variable</TH><TH>ECU Value</TH><TH>Deviation</TH><TH>State</TH></TR>
<TR class='failed'><TD>TEMP_EX</TD><TD>-40</TD><TD>Com_tEnvT_FA</TD><TD>-38.5</TD><TD>1.5</TD><TD>CONVERSION FAILED</TD></TR>
<TR class='failed'><TD>TEMP_EX</TD><TD>-39.5</TD><TD>Com_tEnvT_FA</TD><TD>-38.5</TD><TD>1</TD><TD>CONVERSION FAILED</TD></TR>
<TR class='failed'><TD>TEMP_EX</TD><TD>22</TD><TD>Com_tEnvT_FA</TD><TD>-38.5</TD><TD>60.5</TD><TD>CONVERSION FAILED</TD></TR>
<TR class='failed'><TD>TEMP_EX</TD><TD>83.5</TD><TD>Com_tEnvT_FA</TD><TD>-38.5</TD><TD>122</TD><TD>CONVERSION FAILED</TD></TR>
<TR class='failed'><TD>TEMP_EX</TD><TD>84.5</TD><TD>Com_tEnvT_FA</TD><TD>-38.5</TD><TD>123</TD><TD>CONVERSION FAILED</TD></TR>
<TR class='failed'><TD>TEMP_EX</TD><TD>85</TD><TD>Com_tEnvT_FA</TD><TD>-38.5</TD><TD>123.5</TD><TD>CONVERSION FAILED</TD></TR>


Und damit den Regex nach und nach erweitern, bis ich alle Daten extrahieren kann, die ich brauche.
Und dann würde ich den Regex-Code ins eigentliche Programm übertragen.

Ich denke, Du solltest Dir zuerst klar werden, wie Du positive oder negative Integer- oder Gleitkommazahlen mit Regex einfangen kannst. Nutze dazu die oben genannte Dokumentation.
Hinweise finden sich auch in der PerlFAQ 4

Und den Ansatz, dass die interessanten Werte alleine in einer Tabellenzelle stehen, würde ich wohl erstmal weiter nutzen....
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread HTML mit Perl regex parsen