Einzelnen Beitrag anzeigen

NiceWeather

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

Re: Eigener HTML-Parser/Auslesen von HTML-Tables

  Alt 13. Aug 2009, 15:46
Danke! 8)

Ging wirklich nicht wie ich ursprünglich wollte (habs auch nochmal kompliziert mit Sortierung, etc. versucht).

Am einfachsten ging es dann so:

Delphi-Quellcode:
function THTMLTables.GetHTMLTable(AUrl: string; ATableID: Integer): string;
var
  cResult: string; //Rückgabewert
  cSourceCode: string; //HTML-Quelltext
  nTablesCount: integer; //Anzahl vorhandener Tabellen im cSourceCode
  nStartOffSet: integer; //Da fang ich an nach '<table' zu suchen
  nEndOffSet: integer; //Da fang ich an nach '</table>' zu suchen
  nTableStartPos: integer; //Da fängt meine Table an
  nTableEndPos: integer; //...und da hört sie auf
  nNextTablePos: integer; //Start-Position der jeweils nächsten Table
  nResultLength: integer; //Anzahl der Zeichen, die cResult enthält.
  nI: integer;

begin

  cSourceCode := GetSourceCode(AUrl); //Eigene Funktion, die mittels TIdHTTP, den Quelltext ausgibt
  nTablesCount := TablesCount(cSourceCode, True); //Eigene Funktion zum zählen der Tables im Quelltext - Das boolsche Argument gibt an, ob der Quelltext validiert werden soll (d.h. wenn true und genausoviele Table-Start-Tags wie End-Tags gibt's ein Ergebnis, ansonsten 0)

  //Weiter mit der Initialisierung von Variablen
  nStartOffSet := 1;
  nTableStartPos := 1;
  nTableEndPos := 1;
  nNextTablePos := 1;


  if (ATableID > 0) and
     (ATableID <= nTablesCount) then
    begin

      //Findet die Position von ATableID (1 = Erster Table-Tag, etc.)
      for nI := 0 to ATableID-1 do
          begin
            nTableStartPos := PosEx(tblStartIdentifier, cSourceCode, nStartOffSet);
            nStartOffSet := nTableStartPos + Length(tblStartIdentifier);
          end;

      //Findet den Table-End-Tag
      nEndOffSet := nStartOffSet;
      while (nNextTablePos <= nTableEndPos) and
            (nNextTablePos <> 0) do
        begin
          nNextTablePos := PosEx(tblStartIdentifier, cSourceCode, nStartOffSet);
          nStartOffSet := nNextTablePos + Length(tblStartIdentifier);
          nTableEndPos := PosEx(tblEndIdentifier, cSourceCode, nEndOffSet);
          nEndOffSet := nTableEndPos + Length(tblEndIdentifier);
        end;

      nResultLength := nTableEndPos - nTableStartPos + Length(tblEndIdentifier);
      cResult := Copy(cSourceCode, nTableStartPos, nResultLength);

    end;

  Result := cResult;

end;
Wer möchte kann gerne Kritik an meinem Code üben! Bin immer für "Optimierungen" zu haben.
  Mit Zitat antworten Zitat