Einzelnen Beitrag anzeigen

NiceWeather

Registriert seit: 12. Aug 2009
2 Beiträge
 
#1

Eigener HTML-Parser/Auslesen von HTML-Tables

  Alt 12. Aug 2009, 16:18
Hallo zusammen,

habe ein Logik-Problem und hoffe es kann mir jemand weiterhelfen:

Eine Funktion soll eine HTML-Tabelle als string zurückliefern:

Folgende Deklaration der Funktion:
function GetHTMLTable (AUrl: string; ATableID: integer): string; Der Parameter ATableID ist die Tabelle, die zurückgeliefert werden soll.

Folgende Variablen:
Delphi-Quellcode:
var
  cResult: string; //Der Rükgabewert
  cSourceCode: string;
  nTableStartPos: integer;
  nTableEndPos: integer;
  nOffSet: integer;
  aTableCoordinatesArray: Array of TTableCoordinates; //TTableCoordinates ist ein Record mit den beiden Felden TableStartPos und TableEndPos
  nTableCoordinatesArraySize: integer;
  nI: integer; //Schleifenvariable
Zunächst die Initialisierung einiger Variablen:

Delphi-Quellcode:
  cSourceCode := GetSourceCode(AUrl); //GetSourceCode ist eine eigene Funktion, die mittels TIdHTTP den Sourcecode einer Website liefert. AUrl wurde als Argument an die Funktion geliefert.

  nTableStartPos := Pos(tblStartIdentifier, cSourceCode); //defniert das erste Vorkommen von tblStartIdentifier (String-Konstante= '<table')
  nTableEndPos := Pos(tblEndIdentifier, cSourceCode); //defniert das erste Vorkommen von tblEndIdentifier (String-Konstante= '</table>')
  nTableCoordinatesArraySize := 0;
Dann wird das Array aTableCoordinatesArray mit allen vorkommenden Positionen von '<table' in cSourceCode gefüttert:

Delphi-Quellcode:
  while nTableStartPos > 0 do
    begin
      Inc(nTableCoordinatesArraySize); //Größe des Arrays definieren
      SetLength(aTableCoordinatesArray, nTableCoordinatesArraySize); //Größe des Arrays definieren
      aTableCoordinatesArray[nTableCoordinatesArraySize-1].TableStartPos := nTableStartPos;
      nOffSet := nTableStartPos + Length(tblStartIdentifier); //Offset hinter die letzte gefundene Position setzen
      nTableStartPos := PosEx(tblStartIdentifier, cSourceCode, nOffSet); //schauen, ob's ein weiteres '<table' gibt
    end;
So weit so gut. Es fehlen die Positionen der End-Tags. Die werden folgendermaßen eingelesen:

Delphi-Quellcode:
  for nI := 0 to High(aTableCoordinatesArray) do
    begin
      aTableCoordinatesArray[nI].TableEndPos := nTableEndPos;
      nOffSet := nTableEndPos + Length(tblEndIdentifier); //Offset hinter die letzte gefundene Position setzen
      nTableEndPos := PosEx(tblEndIdentifier, cSourceCode, nOffSet); //nach dem nächsten '</table>' schauen. Es wird angenommen, dass cSourceCode korrekt ist und genauso viele EndTags, wie StartTags vorhanden sind.
    end;
Vorweg: Der Ansatz war, alle vorkommenden Taellen im Quelltext zu kennen, um zu wissen, wo die Table anfängt und wo sie aufhört (Stichwort: Verschachtelte Tables).

Genau da liegt aber mein Problem, denn der End-Tag von
aTableCoordinatesArray[nI].TableStartPos ist nicht unbedingt
Delphi-Quellcode:
 
aTableCoordinatesArray[nI].TableEndPos
Was die Definition des Rückgabewertes betrifft: Das ist nicht das Problem an sich.
Es fällt mir lediglich schwer, zuzuordnen welcher End-Tag zu welchem Start-Tag gehört.

Habe mir schon verschachtelte for-Schleifen überlegt, was allerdings alles nicht hinhaut.

Habt ihr eine Idee? Würdet ihr vom Ansatz her überhaupt so wie ich beginnen?

Vorab vielen Dank für euren Input!
  Mit Zitat antworten Zitat