|
Antwort |
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
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 |
Öffentliches Profil ansehen |
Mehr Beiträge von Christian Seehase finden |
Delphi 11 Alexandria |
#2
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 = 'br' then 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; |
Zitat |
Christian Seehase |
Öffentliches Profil ansehen |
Mehr Beiträge von Christian Seehase finden |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |