AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Klasse HTMLDocument
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse HTMLDocument

Ein Thema von Christian Seehase · begonnen am 18. Mai 2014 · letzter Beitrag vom 21. Mai 2014
Antwort Antwort
Christian Seehase
Registriert seit: 29. Mai 2002
Moin Zusammen,

da immer mal wieder jemand HTML-Dateien auseinander nehmen will, möchte ich hier meine Klasse zum Thema vorstellen.

Klasse: TcsHTMLDocument = class(TObjectList)
Hauptklasse

Allgemein gilt:
Bei der Suche nach HTML-Tags, Attributen und Attributwerten spielt die Gross-/Kleinschreibung keine Rolle.
Der Rückgabewert der Suchmethoden ist -1 falls das Element nicht gefunden wurde oder die Indexangaben ausserhalb des gültigen Bereiches liegen (<0 oder > Gesamtanzahl der Elemente-1).
Ansonsten ist es der Index des gesuchten Elements.


constructor Create;
Initialisiert das Objekt.

destructor Destroy; override;
Zerstört das Objekt.

procedure Clear; override;
Setzt alle Felder des Objektes zurück.

function FindElement(const AType : TcsHTMLElementType;const AsName : string;const AiStart : Integer) : Integer;
Suche nach einem HTML-Tag
AType => Typ des gesuchten Elements (hetStartTag,hetEndTag,hetStandaloneTag)
AsName => Name des gesuchten Elements
AiStart => Ab diesem Index wird nach dem Element gesucht

function FindContentIndex(const AiStart : Integer) : Integer;
Sucht nach dem nächsten Content.
AiStart => Ab diesem Index wird nach Content gesucht (hetContent,hetContentPre)

function FindElementBetween(const AType : TcsHTMLElementType;const AsName : string;const AiFrom : Integer;const AiTo : Integer) : Integer;
Sucht nach einem HTML-Tag zwischen zwei Indizes (jeweils inclusive)
AType => Typ des gesuchten Elements (hetStartTag,hetEndTag,hetStandaloneTag)
AsName => Name des gesuchten Elements
AiFrom => Ab diesem Index wird nach dem Element gesucht
AiTo => Bis zu diesem Index wird nach dem Element gesucht

function FindElementWithAttribValue(const AType : TcsHTMLElementType;const AsName : string;const AsAttrib : string;const AsAttribValue : string;const AiStart : Integer) : Integer;
Sucht nach einem HTML-Tag, dass ein Attribut mit einem bestimmten Wert enthält
AType => Typ des gesuchten Elements (hetStartTag,hetEndTag,hetStandaloneTag)
AsName => Name des gesuchten Elements
AsAttrib => Name des gesuchten Attributs

function FindMatchingTagsBetween(const AsName : string;const AiFrom : Integer;const AiTo : Integer;out AiStart : Integer;out AiEnd : Integer) : boolean;
Sucht nach zusammengehörigen Start-/Endtags zwischen zwei Indizes (jeweils inclusive)
AsName => Name des gesuchten HTML-Tags
AiFrom => Ab diesem Index wird nach dem Element gesucht
AiTo => Bis zu diesem Index wird nach dem Element gesucht

function ReadAttribValue(const AiIndex : Integer;const AsAttrib : string) : string;
Den Wert eines Attributs des Elements an AiIndex auslesen.
AiIndex => Das Element dieses Indizes wird verwendet.
Result => Der Wert des Attributs wird zurückgegeben, oder ein Leerstring, falls das Attribut nicht vorhanden ist oder AiIndex ausserhalb des gültigen Bereichs liegt.

procedure LoadContentFromFile(const AsFilepath : string);
Den auszuwertenden Inhalt aus einer Datei laden.
Nach dem Laden wird automatisch ausgewertet.

property Element[Index : integer]
Gibt das Element (Typ: TcsHTMLElement) an Index zurück.

property Base
Wert des HTML-Tags base bzw. dessen Attributs href.
Falls es nicht vorhanden ist enthält es einen Leerstring

property Root
Nicht genutzt.

property Images
Beim Auswerten des Inhalts werden hier alle Links auf Bilder zurückgegeben.
(Wert des Attributs src des HTML-Tags img)
Format:
<img>=Wert des Attributs src des HTML-Tags img

property Links
Beim Auswerten des Inhalts werden hier alle enthaltenen Ankerpunkte zurückgegben.
(Wert des Attributs href des HTML-Tags a)
Eventuelle #-Angaben werden hierbei abgeschnitten.
Format:
<c>=Content vor dem a-Tag<a>=Link<c>=Content nach dem a-Tag
Ist kein Content vorhanden ist jeweils nur <c>= vorhanden.

property Content
Kann der Inhalt einer HTML-Datei übergeben werden.
Durch das Zuweisen des Wertes wird automatisch die Auswertung gestartet.

Klasse: TcsHTMLElement = class(TObject)
Klasse für ein einzelnes Element der Datei.
Entweder ein HTML-Tag mit Attributen oder Content

constructor Create(const AsName : string;const AElementType : TcsHTMLElementType);
Initialisiert das Objekt
AsName => Der Name des HTML-Tags oder der Content
AElementType => Typ des Elements

destructor Destroy; override;
Zerstört das Objekt.

property Name
Name des Elements oder Content, je nach Typ des Elements

property ElementType
Typ des Elements

property Attribs
Die Liste der Attribute, falls es sich um ein HTML-Tag handelt.

Klasse: TcsHTMLAttribList = class(TObjectList)
Liste der Attribute eines HTML-Tags

function AddAttrib(const AsName : string;const AsValue : string) : Integer;
Fügt ein neues Attribut der Liste hinzu.
AsName => Name des Attributs
AsValue => Wert des Attributs. Der Wert ist nicht mehr in Anführungsstriche eingeschlossen.

property Attrib[Index : integer]
Gibt das Attribut (Typ: TcsHTMLAttrib) an Index zurück.

Klasse: TcsHTMLAttrib = class(TObject)
Klasse für ein einzelnes Attribut

constructor Create(const AsName : string;const AsValue : string);
Intitialisiert das Objekt.
AsName => Names des Attributs
AsValue => Wert des Attributs

property Name
Name des Attributs

property Value
Wert des Attributs (ohne Anführungsstriche)

Typ: TcsHTMLElementType
Eine Liste der Typen der Elemente
hetStartTag => Es handelt sich um ein Start-Tag (z.B. <head>)
hetEndTag => Es handelt sich um ein End-Tag (z.B. </head>)
hetStandaloneTag => Es handelt sich um ein Standalone-Tag (z.B. <br>)
hetContent => Inhalt zwischen HTML-Tags
hetContentPre => Vorformatierter Inhalt zwischen <pre>-Tags
Angehängte Dateien
Dateityp: pas csHTMLTypes.pas (42,6 KB, 41x aufgerufen)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
 
Christian Seehase

 
Delphi 11 Alexandria
 
#2
  Alt 21. Mai 2014, 18:41
Moin Zusammen,

hier mal ein kleines Beispiel.
(es bezieht sich auf diesen Thread: DIV classes mit getElementByID auslesen)


Delphi-Quellcode:
uses Clipbrd,csHTMLTypes;
{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);

var
  LDOC : TcsHTMLDocument;
  iPos : Integer;

  sName : string;
  sDate : string;
  sGroup : string;
  sText : string;

  iPreStart : Integer;
  iPreEnd : Integer;

  i : Integer;

begin
  LDOC := TcsHTMLDocument.Create;
  try
    LDOC.Content := Clipboard.AsText;
    iPos := 0;
    sDate := 'Not Found';
    sName := 'Not Found';
    sGroup := 'Not Found';
    sText := 'Not Found';
    while True do begin
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'div','class','FFT_header',iPos);
      if iPos = -1 then Break;
      inc(iPos);
      sDate := LDOC.Element[iPos].Name;
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'span','class','FFT_header_for_name',iPos);
      if iPos = -1 then Break;
      Inc(iPos);
      sName := LDOC.Element[iPos].Name;
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'span','class','FFT_header_group',iPos);
      if iPos = -1 then Break;
      inc(iPos);
      sGroup := LDOC.Element[iPos].Name;
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'div','class','fftText',iPos);
      if iPos = -1 then Break;
      if not LDOC.FindMatchingTagsBetween('pre',iPos,LDOC.Count-1,iPreStart,iPreEnd) then Break;
      sText := '';
      for i := iPreStart to iPreEnd do begin
        if LDOC.Element[i].ElementType in [hetContent,hetContentPre] then begin
          sText := sText + LDOC.Element[i].Name;
        end else begin
          if LDOC.Element[i].ElementType = hetStandaloneTag then begin
            if LDOC.Element[i].Name = 'brthen begin
              sText := sText+#13#10;
            end;
          end;
        end;
      end;
      ShowMessage('Datum: '+sDate+#13#10+'Name: '+sName + #13#10+'Gruppe: '+sGroup+#13#10+'Text: '+sText);
      sDate := 'Not Found';
      sName := 'Not Found';
      sGroup := 'Not Found';
      sText := 'Not Found';
    end;
  finally
    LDOC.Free;
  end;
  Close;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz