Texte parsen mit vorgegebenen Schema

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
crowl
Beiträge: 43
Registriert: 13.06.2004 14:31:48

Texte parsen mit vorgegebenen Schema

Beitrag von crowl » 09.01.2007 21:13:46

Hallo,

ich möchte Aktienkurse beobachten, dazu möchte ich unterschiedliche Webseite abfragen und deren Informationen verarbeiten und speichern. Tools zum herunterladen der Webseite (wget) und zum abspeichern in Textdatei/Datenbank sind bekannt. Was mir fehlt ist das "Zwischenstück" zum parsen des Webseiteninhaltes.

Auf allen Webseiten steht Informationen die der Aktie zuzuordnen sind, Wert für z.B. Nr., Unternehmen, Markt, Brache, Vortag, Aktuell. Dem Tool möchte ich die html Datei geben und das dazupassende Schema, und das Tool sollte mir die Information aufbereitet, z.B. in einer cvs oder xml format ausgeben.

Vereinfachtes Beispiel:
Webseite:

Code: Alles auswählen

<html><body>
Text menu, etc. vieles was man nicht braucht.
Jetzt kommt die interessante Tabelle:
<table>
Hier stehen unwichtige sachen...
<tr><td>Aktiennr</td><td>brauch ich nicht</td><td>Aktuell</td>
</tr>
<tr><td>123</td><td>text...</td><td>42.24</td>
</tr>
<table>
<body></html>
Das Schema (oder wie auch immer das bezeichnet wird) das für das parsen benötigt wird, als Idee mal z.B.:

Code: Alles auswählen

Suche -> "<tr><td>Aktiennr</td><td>brauch ich nicht</td><td>Aktuell</td>
</tr>"
Parse -> <tr><td>{Aktiennr}</td><td>{*}</td><td>{Kurs}</td></tr>
Die Ausgabe könnte z.B. so aussehen:

Code: Alles auswählen

<Aktiennr>123</Aktiennr><Kurs>42.24</Kurs>
Gibt es da etwas in dieser Richtung?

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 09.01.2007 21:20:18

Hi!
Das ginge sicherlich mit regulären Ausdrücken, allerdings bin ich bei dem Thema auch erst am Anfang und will hier nichts Falsches verbreiten.
Allerdings hätte die Lösung immer das Problem, daß bei der kleinsten Änderung im html-code nichts mehr passiert. Es gibt doch sicherlich gerade für Aktienkurse Programme und Applets zuhauf, findet sich da nicht etwas, das Deinen Bedürfnissen entspricht?
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 09.01.2007 21:41:19

Das hier verwendete Perlmodul ist im Debianpaket "libhtml-tableextract-perl" enthalten

Code: Alles auswählen

#!perl
use strict;
use warnings;

  use HTML::TableExtract;

  my $te = HTML::TableExtract->new( headers => [qw(Aktiennr Aktuell)]  );
  
  foreach my $file (@ARGV) {

    my $html=`/bin/cat $file`;

    $te->parse($html);

    foreach my $ts ($te->tables) {
      foreach my $row ($ts->rows) {
        print join(',', @$row), "\n";
      }
    }
  }

Code: Alles auswählen

gms@gms1:~$ cat x.html
<html><body>
Text menu, etc. vieles was man nicht braucht.
Jetzt kommt die interessante Tabelle:
<table>
Hier stehen unwichtige sachen...
<tr><td>Aktiennr</td><td>brauch ich nicht</td><td>Aktuell</td>
</tr>
<tr><td>123</td><td>text...</td><td>42.24</td>
</tr>
<table>
<body></html>
gms@gms1:~$ perl x.pl x.html
123,42.24

Gruß
gms

crowl
Beiträge: 43
Registriert: 13.06.2004 14:31:48

Beitrag von crowl » 09.01.2007 21:45:32

Hallo Kokopelli,

danke für deine Rückmeldung. Leider gibt es noch nichts was meinen Anforderungen entspricht. Es gibt in der Tat Programme die mir Kurse und Infos bereitstellen. Ich möchte aber auch noch ein paar weitere Information dazu haben, die es eben nur auf den Webseiten gibt (Kommentarfelder, empfehlungen, Bewertugen, etc.). Diese möchte ich von unterschiedlichen Webseiten zusammentragen und spätestens da scheitern die Programme die ich bis jetzt gefunden habe, da sie mir immer nur von einem Anbieter die Infos liefern.

Reguläre Ausdrücke sind eine gute Idee an die ich noch gar nicht gedacht habe. Kann man damit auch folgendes machen:

Code: Alles auswählen

<html>
titel, meta, etc. body
unwichtige Sachen
MarktA:
<table><tr><td>Bez1</td><td>Kurs1</td><tr>
<tr><td>Bez2</td><td>Kurs2</td><tr></table>
Hier kann dann auch Text stehen
MarktB:
<table><tr><td>Bez3</td><td>Kurs3</td><tr>
<tr><td>Bez4</td><td>Kurs4</td><tr>
<tr><td>Bez5</td><td>Kurs5</td><tr></table>
MarktC
<table><tr><td>Bez6</td><td>Kurs6</td><tr></table>
</html>
Als Ausgabe hätte ich gerne:

Code: Alles auswählen

<Markt>MarktA</Markt><Bez>Bez1</Bez><Kurs>Kurs1</Kurs>
<Markt>MarktA</Markt><Bez>Bez2</Bez><Kurs>Kurs2</Kurs>
<Markt>MarktB</Markt><Bez>Bez3</Bez><Kurs>Kurs3</Kurs>
<Markt>MarktB</Markt><Bez>Bez4</Bez><Kurs>Kurs4</Kurs>
<Markt>MarktB</Markt><Bez>Bez5</Bez><Kurs>Kurs5</Kurs>
<Markt>MarktC</Markt><Bez>Bez6</Bez><Kurs>Kurs6</Kurs>

Benutzeravatar
Kokopelli
Beiträge: 1156
Registriert: 08.01.2007 10:13:24
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von Kokopelli » 09.01.2007 21:49:12

Wenn ich Dir jetzt sagen könnte, was man alles mit RegEx machen kann und was nicht, wäre ich echt stolz auf mich 8) ... Bin da wie gesagt auch nicht wirklich fit. Aber ich denke, gms hat die Lösung schon geliefert.
Beste Grüße, Kokopelli
--------------------------
"One must marvel that Godzilla never died laughing" (William Tsutsui)

crowl
Beiträge: 43
Registriert: 13.06.2004 14:31:48

Beitrag von crowl » 09.01.2007 21:52:16

Hallo gms,

Dein Post hat sich mit meinem letzten Eintrag überschnitten. Zunächst aber erst einmal danke für deine Antwort und deinen Vorschlag. Das Script sieht schon sehr gut aus. Wenn ich das aber richtig verstanden habe, dann benötigt es Überschriften von Tabellen. Läßt sich das Script vielleicht auch mit dem von mir zuletzt geposteten Beispiel vereinbaren? Oder gibt es noch alternativen?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 09.01.2007 22:10:43

crowl hat geschrieben:Wenn ich das aber richtig verstanden habe, dann benötigt es Überschriften von Tabellen. Läßt sich das Script vielleicht auch mit dem von mir zuletzt geposteten Beispiel vereinbaren?
im schlimmsten Fall kannst du das ganze ohne die Überschriften auch in eine Tree-Struktur einlesen, aber so sollte es auch gehen:

Das ist jetzt allerdings ungetestet:

Code: Alles auswählen

#!perl 
use strict; 
use warnings; 

  use HTML::TableExtract; 

  
  foreach my $file (@ARGV) { 

    my $html=`/bin/cat $file`; 

    for ( my $i=0; $i<3; $i++) {
      my $te = HTML::TableExtract->new( headers => [qw( "Bez$i" "Kurs$i" )]  ); 
      $te->parse($html); 
    
      foreach my $ts ($te->tables) { 
        foreach my $row ($ts->rows) { 
          print "Mart",chr(ord("A")+$i),",",join(',', @$row), "\n"; 
        } 
      } 
    }
  }
crowl hat geschrieben: Oder gibt es noch alternativen?
vom Namen nach kenne ich noch das Modul "HTML::TableParser", es gibt aber wahrscheinlich noch mehrere.
http://search.cpan.org/


Gruß
gms

crowl
Beiträge: 43
Registriert: 13.06.2004 14:31:48

Beitrag von crowl » 09.01.2007 23:33:06

Ich muss mich entschuldigen. Das Beispiel war denkbar schlecht gewählt. Die fortlaufenden Nummer erweckten den anschein, dass dort wirklich Nr. stehen. Das ist nicht der Fall.

Ein Beispiel mit richtigen Werten würde etwa so aussehen:

Code: Alles auswählen

<html> 
titel, meta, etc. body 
unwichtige Sachen 
DAX: 
<table><tr><td>MAN</td><td>70,82</td><tr> 
<tr><td>Hypo Real Estate</td><td>49,18</td><tr></table> 
Hier kann dann auch Text stehen 
Nasdaq: 
<table><tr><td>Apple Computer</td><td>92,57</td><tr></table>
etc.
</html>
Danke auch für den Link. Dieser ist mir vorab auch schon bei meiner Google Suche untergekommen. Meine Anforderungen sind wohl zu speziel und es sieht so aus, als wenn ich mich mal etwas genauer mit perl scripting befassen muss.

Falls noch jemand weitere Vorschläge hat, nur her damit :wink:

crowl
Beiträge: 43
Registriert: 13.06.2004 14:31:48

Beitrag von crowl » 10.01.2007 23:43:57

Ich habe noch mal eine Frage zu dem HTML::TableExtract. Inzwischen bin ich der Meinung, dass ich das doch verwenden kann. Allerdings bekomme ich es nicht ans laufen.

Code: Alles auswählen

-----cw@wip:~$ clear
mm@m12s24:~$ cat x.pl
#!/usr/bin/perl
use strict;
use warnings;

  use HTML::TableExtract;

  my $te = HTML::TableExtract->new( headers => [qw(Aktiennr Aktuell)]  );


my $file;
open (DATEI, "x.html") or die $!;
        while(<DATEI>) {
                $file = $file.$_;
        }
close (DATEI);
print $file;
print "-----";
$te->parse($file);
    foreach my $ts ($te->tables) {
      foreach my $row ($ts->rows) {
        print join(',', @$row), "\n";
      }
    }
cw@wip:~$ ./x.pl
<html><body>
Text menu, etc. vieles was man nicht braucht.
Jetzt kommt die interessante Tabelle:
<table>
Hier stehen unwichtige sachen...
<tr><td>Aktiennr</td><td>brauch ich nicht</td><td>Aktuell</td>
</tr>
<tr><td>123</td><td>text...</td><td>42.24</td>
</tr>
<table>
<body></html>
-----cw@wip:~$
libhtml-tableextract-perl ist installiert. Hat jemand eine Idee?

Antworten