Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi HTML Datei parsen (https://www.delphipraxis.net/24640-html-datei-parsen.html)

EConvertError 23. Jun 2004 19:44


HTML Datei parsen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Hoffentlich bin ich hier im richtigen Forum...

Ich habe hier eine HTML Datei (siehe Anhang), mit einigen Tabellen. Nun möchte ich die Daten der ersten Tabelle in eine Listview übertragen.

Dazu muss ich ja die Datei parsen. Ich habe auch schon die einzelnen Zeilen, die zu parsen sind mittels einer Schleife ermittelt.

Wie aber bekomme ich die eigentlichen Daten aus den Zeilen heraus? Ich habe schon Experimente mit Pos() und Copy() gemacht, werde damit aber einfach nicht fertig.

Code:
<td align="right" class="topline"><font class="normtxt" size="2" face="Arial">[b]MO 21.06.04[/b]</font></td>

<td align="center" class="topline"><font class="normtxt" size="2" face="Arial">5C</font></td>

<td align="right">5C;</td>

<td align="center"></td>
Aus diesen Zeilen (oben), zum Beispiel, will ich folgende Strings in die Listview übertragen: MO 21.06.04,5C, . (ich brauch nur die Strings, keine Schriftart, etc.)

Die Länge und der Inhalt der Tabelle sind zur Laufzeit immer verschieden. Nur der Aufbau der Datei ist immer gleich.

Vielen Dank,
EConvertError

Nicodius 23. Jun 2004 19:46

Re: HTML Datei parsen
 
such mal unter , pos copy delete, val

MathiasSimmack 23. Jun 2004 21:56

Re: HTML Datei parsen
 
Noch besser wäre ein richtig schöner HTML-Parser (evtl. mit DOM-Unterstützung).

Wenn man bspw. den TWebBrowser verwendet, hat man Zugriff auf dessen "Document", und ab da ist wie in JavaScript. Man kann bestimmte Elemente suchen, bspw. alle Links, und den Inhalt auslesen und anzeigen, usw.

Warum ich den Parser erwähne?
Eine HTML-Tag in dieser Form:
Code:
<table border="0" cellspacing="0"
  cellpadding="4"
  style="border:#000000 1px solid;">
(also mehrzeilig) wäre ja nicht falsch, aber beim zeilenweisen Einlesen würde evtl. die copy/pos-Routine aus dem Tritt kommen ... ;)

EConvertError 24. Jun 2004 12:08

Re: HTML Datei parsen
 
Danke für die schnelle Hilfe!

Also den TWebBrowser verwende ich nicht. Ein Parser wäre sicher fein, allerdings denke ich, dass ich es mit ein wenig Hilfe auch ohne schaffe. :wink:

Die auszulesenden Zeilen sind sicher nicht mehrzeilig, also dürfte es mit einer selbstgebauten Routine auch funktionieren. Allerdings habe ich mich schon tagelang mit Copy(), Pos(), Delete(), etc. gespielt, aber leider ohne Erfolg. :wall:

Leider habe ich mit dem Parsen von Texten überhaupt keine Übung. Im Prinzip bräuchte ich eine Funktion (oder zumindest einen Denkanstoß zu einer Funktion), die alle 3 oben angeführten Zeilen parsen kann.

Wie geschrieben, ich brauche nur die Strings (Schrift, Ausrichtung, etc. ist nicht nötig).

Mit freudlichen Grüßen,
EConvertError

moritz 24. Jun 2004 12:28

Re: HTML Datei parsen
 
Reguläre Ausdrücke sind auch immer wieder geschickt.

Gruß

Luckie 24. Jun 2004 12:31

Re: HTML Datei parsen
 
Wo ist das Problem? Du suchst dir mit
Delphi-Quellcode:
pos('[b]', Zeile);
[/b]

den Anfang der gewünschten Zeichenfolge und mit
Delphi-Quellcode:
pos('
Delphi-Quellcode:
', Zeile);
das Ende und dann kopierst du mit copy die Zeichenfolge raus.

EConvertError 24. Jun 2004 12:47

Re: HTML Datei parsen
 
Soweit war ich auch schon. Leider gibt es da aber noch die 2 anderen Zeilen, die kein '' und '' enthalten.
Die Lösung des Problems kann doch nicht sein, dass ich 3 verschiedene Prozeduren brauche?
Es wird doch möglich sein, alles mit einer Prozedur herauszuparsen? Nur wie?

Danke,
EConvertError

Luckie 24. Jun 2004 12:50

Re: HTML Datei parsen
 
Wenn du mit pos arbeitest wird es nicht anderes gehen. Wie weit du mit Regulären Ausdrücken kommst, kann ich dir nicht sagen, da hab eich keinerlei Erfahrung.

moritz 24. Jun 2004 12:50

Re: HTML Datei parsen
 
Reguläre Ausdrücke, damit geht das. Lies dir mal das Kapitel genau durch, Google weiß viel dazu! :)

Aenogym 24. Jun 2004 12:51

Re: HTML Datei parsen
 
hi,

bei torry habe ich eine HTML-parser komponente gefunden:
http://torry.net/vcl/internet/html/jshtmpsr.zip

die ist ziemlich leicht zu bedienen. das sollte dir einige arbeit abnehmen, da du alle tags "durchwandern" kannst und auch den text zwischen zwei parametern ausgeben lassen kannst und auch die parameter eines tags.

Aenogym

EConvertError 24. Jun 2004 13:08

Re: HTML Datei parsen
 
Vielen Dank für eure Geduld!

Das mit dem HTML Parser sieht sehr verlockend für mich aus.

Allerdings habe ich schon ein wenig Code, der aber immer scheitert, weil irgendwie eine Endlosschleife entsteht. Vielleicht könnt ihr euch den ansehen. Falls der Fehler nicht gefunden wird, werde ich zur HTML Parser Kompo greifen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  StrList: TStringList;
begin
  StrList:= TStringList.Create;
  StrList.LoadFromFile('result.htm'); //die HTML Datei (siehe Anhang des ersten Post)
  ParseStringList(StrList);
  StrList.Free;
end;

procedure TForm1.ParseStringList(const StrList: TStrings);
var
  I, C, Index: Integer;
begin
  I:= 0;
  while StrList[I] <> '' do
  begin
    if StrList[I]= '<tr bgcolor="#C6D6D6">' then begin //danach kommt eine Zeile in der Tabelle
      Index:= I;
      for C:= 1 to 9 do begin //eine Zeile in der Tabelle entspricht 9 Zeilen HTML Code
        Inc(Index);
        ParseLine(StrList[Index]);
      end;
    end;
    Inc(I);
  end;
end;

procedure TForm1.ParseLine(Line: String);
var
  FPos, SecPos: Integer;
begin
  Line:= Trim(Line);
  while Pos('<', Line) > 0 do begin
    FPos:= Pos('<', Line);
    SecPos:= Pos('>', Line);
    Delete(Line, FPos, SecPos-FPos+1);
  end;
  Memo1.Lines.Add(Line); //Anzeigen zu Testzwecken
end;
Mit freudlichen Grüßen,
EConvertError

Cubbie 24. Jun 2004 13:23

Re: HTML Datei parsen
 
Hi,

wie wärs denn damit, der Reihe nach alle '>' - Zeichen in der Zeile zu suchen (mit Pos) und dann jeweils das dahinter kommende Zeichen anzuschauen. Da gibts dann zwei Fälle:

1. es kommt ein '<' - Zeichen
Dann eben ab dort das nächste '>' suchen und weiter im Text..

2. es kommt was anderes ;)
Das sollte (zumindest im obigen Fall) dann einer der gesuchten Strings sein, den man mit Copy ausschneiden kann (von aktueller Position bis Position des nächsten '<', die man wieder mit Pos rauskriegt).

Auf Newlines müsste man vielleicht noch abfragen, falls du nicht Zeile für Zeile durchgehst.
Ist sicher keine allzu elegante Lösung, aber müsste klappen..

Sorry für die rein theoretische Ausführung, aber bevor ich hier Code hinknalle, den ich nicht testen kann, mach ichs lieber so.. ;)

Gruß,
Marc

EConvertError 24. Jun 2004 13:30

Re: HTML Datei parsen
 
Klingt auch gut, aber wie suche ich nach dem nächsten '>'?

Pos() liefert doch immer nur das erste passende Zeichen im String.

Mein Ansatz war, dass ich nach einem '<' und '>' suche, und es mit allem dazwischenliegendem herausschneide mit Delete(). Und das so lange, bis ich kein '<' mehr finde. Dann sollte mein gesuchter String übrigbleiben. Das funktioniert auch lange, aber auf einmal bleibt er in der Schleife hängen --> Endlosschleife.

EConvertError

moritz 24. Jun 2004 13:35

Re: HTML Datei parsen
 
Warum denn keine Regulären Ausdrücke? Sind super schnell und wenn du ihn einmal hast läufts wie geschmiert!

EConvertError 24. Jun 2004 13:39

Re: HTML Datei parsen
 
Weil ich um ehrlich zu sein, noch nicht einmal weiß, was Reguläre Ausdrücke sind. :oops:

moritz 24. Jun 2004 13:41

Re: HTML Datei parsen
 
Dem kann geholfen werden:
http://de.selfhtml.org/cgiperl/sprache/regexpr.htm
Mehr [google]Reguläre AND Ausdrücke[/google]

Cubbie 24. Jun 2004 13:52

Re: HTML Datei parsen
 
Zitat:

Zitat von EConvertError
Klingt auch gut, aber wie suche ich nach dem nächsten '>'?

Pos() liefert doch immer nur das erste passende Zeichen im String.

Ab Delphi 7 gibt es PosEx, da kann man die Startposition für die Suche angeben. Sonst müsste man mit einem temporären String arbeiten, wo immer der schon abgearbeitete Teil abgeschnitten wird.

Zitat:

Zitat von EConvertError
Mein Ansatz war, dass ich nach einem '<' und '>' suche, und es mit allem dazwischenliegendem herausschneide mit Delete(). Und das so lange, bis ich kein '<' mehr finde. Dann sollte mein gesuchter String übrigbleiben. Das funktioniert auch lange, aber auf einmal bleibt er in der Schleife hängen --> Endlosschleife.

Das klingt eigentlich so, als obs funktionieren müsste... könnte mir nur vorstellen, dass das Delete vielleicht ein '<' oder '>' beim Wegschneiden "vergisst" und so nie fertig wird...

EDIT: Ne... habs mir mal angeschaut. Das hier ist deine Problemzeile (die erste... ob das später nochmal auftritt, weiß ich nicht):

XML-Code:
<td><font class="normtxt" size="2" face="Arial">-> 22.6. / 5</font></td>
Wenn er hier nämlich die ersten beiden Tags weggeschnitten hat, findet er plötzlich ein > VOR einem <... und dann wird nix gelöscht.

Christian Seehase 24. Jun 2004 16:54

Re: HTML Datei parsen
 
Moin EConvertError,

i.d.R. sind HTML Dateien ja nicht sehr gross, also könntest Du die einfach in eine Stringvariable einlesen, und könntest dann einfach mit Indizes, ganz ohne Pos, die Texte filtern.
Voraussetzung wäre natürlich, dass die Datei syntaktisch korrekt ist, damit auch immer < > Paare vorhanden sind, wo sie hingehören.
Ausserdem müsste sichergestellt sein, bei der einfachen Variante, dass keine Scriptsprachen eingebettet sind, die eventuell diese Zeichen in Strings enthalten, dadurch könnte sonst die Zählung durcheinander geraten.

EConvertError 24. Jun 2004 18:14

Re: HTML Datei parsen
 
Ich bin ja richtig beeindruckt von eurer Hilfsbereitschaft! Danke!

Wie ich das so sehe, ist genau das das Problem: In diesem String '-> 22.6. / 5' kommt ein Sonderzeichen (>) vor.

Da ich stolzer Besitzer von Delphi 7 bin, könnte ich zuerst die Position des '<' Zeichens ermitteln und dann mittels PosEx() die zweite Klammer:

Delphi-Quellcode:
FPos:= Pos('<', Line);
    SecPos:= PosEx('>', Line, FPos); //FPos= Offset
...vorausgesetzt das '<' Zeichen kommt in keinem String vor.
Oder liege ich da falsch?

mfg,
EConvertError

Christian Seehase 24. Jun 2004 19:56

Re: HTML Datei parsen
 
Moin EConvertError,

ein String in der gezeigten Form dürfte in einer HTML-Datei aber eigentlich nicht vorkommen, sondern müsste durch &gt; ersetzt worden sein.

EConvertError 25. Jun 2004 09:26

Re: HTML Datei parsen
 
Ich weiß, dass das nicht erlaubt ist, aber die HTML- Datei ist nicht von mir. Ich habe keinen Einfluss auf die Erstellung und Gestaltung der Seite. Tatsache ist, dass ich es parsen will/muss.

Danke,
EConvertError


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz