Kürzlich simuliert ich die Einreichung von Webseiten und kehre zum Quellcode für Webseiten zurück und erhalte dann die entsprechenden Elemente in der Webseite Bei der Suche fand ich mehrere Delphi -Versionen von HTMLParser -Klassen. Ich dachte also, wenn es einen Browser auf der Schnittstelle gibt, können wir Webseitenelemente über die Dokumentenschnittstelle von Webbrowser bedienen, was sehr bequem ist! Wenn Sie jedoch die Webseiten -Einreichung simulieren, erscheint Webbrowser nicht unbedingt auf der Benutzeroberfläche. Das Objekt im Inneren kann HTML nach der Parsen, der Suche nach MSDN und dann googeln, es funktioniert und die Konstruktionsmethode lautet wie folgt:
// IHTMLDOCUMENT2 -Schnittstelle erstellen
Cocreateinstance (class_htmldocument, nil, clsctx_inproc_server, iid_ihtmldocument2, fhtmldoc);
Nachdem die Schnittstelle erstellt wurde, können die Dokumentelemente analysiert werden, was sehr erfrischend ist!
Wenn ich meine eigenen einzigartigen Vorgänge kombiniert, habe ich einige Webseitenelemente wie Combobox, Tabelle, Rahmen usw. zusammengefasst und einen HTMLParser implementiert.
Hier wird nur eine Erklärung abgegeben. Bitte laden Sie den Code am Ende herunter
Code
(********************************************************* *****)
(*Dexian Studio*)
(*Webseitenelement -Betriebsklassenbibliothek*)
(**)
(*Dxhtmlelement Unit*)
(*Copyright (C) 2008-2010 NO Idle*)
(*E -Mail: [email protected]: 75492895*)
(********************************************************* *****)
Einheit dxHtmlelement;
Schnittstelle
Verwendet Windows, Sysutils, ClipBrd, MSHTML, ActiveX, Sektls, Grafiken, Typinfo;
{Elementtyp}}
Funktion isSelectelement (Elelement: IHTMLElement): boolean;
Funktion ISPWDELement (Elelement: iHtmlelement): boolean;
Funktion iStextElement (Element: iHtmlelement): boolean;
Funktion isTableElement (Element: IHtmlelement): boolean;
Funktion ISElementCollection (Element: IHtmlelement): boolean;
Funktion Ischkelement (Element: IHtmlelement): boolean;
Funktion isRadiobtnelement (Element: iHtmlelement): boolean;
Funktion ismemoelement (Element: IHtmlelement): boolean;
FunktionsformaleLement (Element: IHtmlelement): boolean;
Funktion issimgelement (Element: iHtmlelement): boolean;
Funktion isInimgelement (Element: iHtmlelement): boolean;
Funktion islabelelement (Element: IHtmlelement): boolean;
Funktion iSlinkelement (Element: iHtmlelement): boolean;
Funktion isListElement (Element: iHtmlelement): boolean;
Funktion isControlelement (Element: iHtmlelement): boolean;
Funktion isObjectElement (Element: iHtmlelement): boolean;
Funktion isFrameElement (Element: iHtmlelement): boolean;
Funktion isInputBtnelement (Element: iHtmlelement): boolean;
Funktion isinhiddenElement (Element: iHtmlelement): boolean;
Funktion issubmitElement (Element: IHtmlelement): boolean;
{Get Imgelement Data}
Funktion getPicIndex (doc: ihtmldocument2; SRC: String; Alt: String): Integer;
Funktion GetPicelement (doc: ihtmldocument2; Imgname: String; SRC: String; Alt: String): IHtmlimgelement;
Funktion getRegCodepic (DOC: IHTMLDOCUMENT2; Imgname: String; SRC: String; Alt: String): TPICTURE;
Funktion getRegcodepic (DOC: IHTMLDOCUMENT2; INDEX: Ganzzahl): TPICTURE;
Funktion getRegCodepic (DOC: IHTMLDOCUMENT2; Element: IHtmlimGelement): tPicture; Überlastung;
Typ
TobjectFromlresult = function (lresult: lresult; const iid: tiid; wparam: wparam; out pobject): hresult;
Telementtype = (ele_unknow, ele_text, ele_pwd, ele_select, ele_checkbox, ele_radiobtn, ele_memo, ele_form, ele_image,
Ele_label, ele_link, ele_list, ele_control, ele_object, ele_frame, ele_inputbtn, ele_inimage, ele_inhidden);
Funktion getElementtype (Element: iHtmlelement): Telementtype;
Funktion getElementtypename (Element: IHtmlelement): String;
Funktion GethtmltableCell (atable: ihtmltable; arow, acol: Integer): ihtmlelement;
Funktion Gethtmltable (adoc: ihtmldocument2; aIndex: Integer): Ihtmltable;
Funktion getWebBrowserHtmltableCellText (doc: ihtmldocument2;
const tableIndex, rowIndex, colindex: Integer; var ResValue: String): boolean;
Funktion Gethtmltablerowhtml (atable: ihtmltable; arow: Integer): iHtmlelement;
Funktion getWebBrowserHtmltableCellHtml (DOC: IHTMLDOCUMENT2;
const tableIndex, rowIndex, colindex: Integer; var ResValue: String): boolean;
Funktion GEHTMLTABLEHTML (ATABLE: IHTMLTABLE; AROW: Ganzzahl): iHtmlelement;
Funktion getWebBrowserHtmltableHtml (DOC: IHTMLDOCUMENT2;
const tableIndex, rowIndex: Integer; var ResValue: String): boolean;
Typ
TdxwebframeCollection = Klasse;
TdxWebelementCollection = Klasse;
TloadState = (doc_loading, doc_completed, doc_invalidate);
Tdxwebframe = Klasse
Privat
FFrame: ihtmlWindow2;
FelementCollections: TDXWebelementCollection;
Fwebframecollections: tdxwebframecollection;
Funktion GetRC: String;
Funktion getElementCount: Ganzzahl;
Funktion getWebframeCollections: tdxWebframeCollection;
Funktion GetElementCollections: TDXWebelementCollection;
Funktion getDocument: Ihtmldocument2;
Funktion getReadState: Tadstate;
Funktion getisloaded: boolean;
Prozedur setFrame (const value: ihtmlWindow2);
Funktion getName: String;
öffentlich
Konstruktor create (Iframe: ihtmlWindow2);
Zerstörer zerstören; überschreiben;
Eigenschaftsrahmen: IHTMLWINDOW2 Lesen Sie fFrame write setframe;
Eigenschaft SRC: String Read Getrc;
Eigenschaftsdokument: Ihtmldocument2 Lesen Sie getDocument;
Eigenschaftsname: String lesen GetName;
Eigenschaftsrahmen: TDXWebframeCollection Lesen Sie GetWebframeCollections;
Property ElementCount: Integer Read GetElementCount;
Eigenschaftselemente: TDXWebelementCollection Read GetElementCollections;
Eigenschaft ReadyState: Tadstate Read GetReadState;
Immobilie Isloaded: boolean read getIsloaded;
Ende;
TdxwebframeCollection = Klasse
Privat
FframeCollection: IHTMLFramesCollection2;
Rahmen: tdxwebframe;
Funktion getCount: Ganzzahl;
Funktion getFrameInterfaceByIndex (Index: Integer): iHtmlWindow2;
Funktion getFrameInterfaceByName (Name: String): IHtmlWindow2;
Funktion getframyIndex (Index: Integer): tdxwebframe;
Funktion getframyname (Name: String): TDXWebframe;
Prozedur setFrameCollection (const value: ihtmlframesCollection2);
öffentlich
Konstruktor erstellen (acollection: ihtmlFramesCollection2);
Zerstörer zerstören; überschreiben;
Property Framecollection: IHTMLFramesCollection2 Lesen Sie fFrameCollection write setFrameCollection;
Immobilienanzahl: Ganzzahl Read getCount;
Eigenschaft FrameInterfacebyIndex [Index: Integer]: IHTMLWINDOW2 LESEN GetFrameInterfaByIndex;
Eigenschaft FrameInterfaceByName [Name: String]: IhtmlWindow2 lesen
Eigenschaft FrambyIndex [Index: Integer]: TDXWebframe Read getframyIndex;
Eigenschaft FrameByName [Name: String]: TDXWebframe Read getframyName;
Ende;
TdxwebelementCollection = Klasse
Privat
Fcollection: ihtmlelementCollection;
FchildCollection: tdxwebelementCollection;
Funktion getCollection (Index: String): TDXWebelementCollection;
Funktion getCount: Ganzzahl;
Funktion getElement (itemName: String; Index: Integer): iHtmlelement;
Funktion getElementByName (ElementName: String): IHtmlelement;
Funktion getElementByIndex (Index: Ganzzahl): iHtmlelement;
Verfahren setCollection (const value: ihtmlelementCollection);
öffentlich
Konstruktor erstellen (Acollection: iHtmlelementCollection);
Zerstörer zerstören; überschreiben;
Immobiliensammlung: IhtmlelementCollection lesen fcollection write setCollection;
Eigenschaft ChildelementCollection [Index: String]: TDXWebelementCollection Read GetCollection;
Property ElementCount: Integer Read GetCount;
Eigenschaftselement [ItemName: String; Index: Integer]: IHtmlelement Read GetElement;
Eigenschaft elementbyName [itemName: String]: Ihtmlelement Read GetElementByName;
Property ElementByIndex [Index: Integer]: IHtmlelement Read GetElementByIndex;
Ende;
TlinkCollection = class (tdxwebelementCollection)
Ende;
TDXWEBTABLE = Klasse;
TdxtableCollection = Klasse
Privat
FtableCollection: ihtmlelementCollection;
Fdocument: ihtmldocument2;
FWEBTABLE: TDXWEBTABLE;
Funktion GetTableInterfaceByName (Aname: String): iHtmltable;
Prozedur -SetDocument (Wert: IHTMLDOCUMENT2);
Funktion GetTableInterfaByIndex (Index: Integer): iHtmltable;
Funktion getCount: Ganzzahl;
Funktion GetTableByIndex (Index: Integer): tdxWebtable;
Funktion GetTableByName (Aname: String): tdxWebtable;
öffentlich
Konstruktor create (doc: ihtmldocument2);
Zerstörer zerstören; überschreiben;
Property TableInterfaceByName [Aname: String]: Ihtmltable Read GettableInterfaceByName;
Property TableInterfacebyIndex [Index: Integer]: IHtmltable Read GettableInterfaceByIndex;
Property TableByName [Aname: String]: tdxWebtable Read GettableByName;
Property TableByIndex [Index: Integer]: tdxWebtable Read GettableByIndex;
Eigenschaftsdokument: IHTMLDOCUMEND2 Lesen Sie Fdocument schreiben SetDocument;
Immobilienanzahl: Ganzzahl Read getCount;
Ende;
TDXWEBTABLE = Klasse
Privat
FtableInterface: ihtmltable;
Funktion getrowcount: Integer;
Prozedur sessableInterface (const value: ihtmltable);
Funktion getCell (ACOL, AROW: Ganzzahl): String;
Funktion getrowcolcount (RowIndex: Ganzzahl): Ganzzahl;
Funktion getinnerhtml: String;
Funktion GetInNeText: String;
Funktion getCellelement (ACOL, AROW: Ganzzahl): iHtmltableCell;
öffentlich
Konstruktor erstellen (atable: ihtmltable);
EigenschaftstabelleInterface: IHTMLTABLE LEAD FTABLEIsInterface Write SETTABLEISTERFACE;
Property RowCount: Integer Read GetRowCount;
Eigenschaftszelle [Acol: Integer; AROW: Ganzzahl]: String Read getCell;
Eigenschaftszellelement [ACOL: Ganzzahl; Arow: Integer]: IHtmltableCell lesen GetCellelement;
Property RowColcount [RowIndex: Integer]: Integer Read GetRowColcount;
Eigenschaft Innerhtml: String Read GetInnerHtml;
Eigenschaft innerText: String Read GetInNeText;
Ende;
Tdxwebcombobox = Klasse
Privat
FhtmlSelect: ihtmlSelectElement;
Funktion getCount: Ganzzahl;
Prozedur setItemIndex (const value: Integer);
Funktion getItemindex: Ganzzahl;
Funktion getName: String;
Prozedur setName (const value: String);
Funktion GetValue: String;
Prozedur setValue (const value: String);
Prozedur setCombinterface (const value: ihtmlSelectElement);
Funktion getItemByName (Elename: String): String;
Funktion getItembyIndex (Index: Ganzzahl): String;
Funktion getItemAttribute (Index: Integer; AttribName: String): olevariant;
öffentlich
Constructor Create (Awebcombo: iHtmlSelectElement);
Prozedur add (ELE: IHTMLELEMement);
Prozedureinfügung (ELE: IHTMLElement; Index: Integer);
Verfahren entfernen (Index: Integer);
Eigenschaft Combinterface: IhtmlSelectElement lesen
Immobilienanzahl: Ganzzahl Read getCount;
Eigenschaft itemIndex: Integer lesen GetItemIndex schreiben setItemindex;
Eigenschaft itembyIndex [Index: Integer]: String lesen GetItembyIndex;
Eigenschaft itembyName [Elename: String]: String lesen GetItemByName;
Eigenschaft itemAttribute [Index: Integer; AttribName: String]: olevariant read getItemattribute;
Eigenschaftsname: String lesen GetName Write setName;
Eigenschaftswert: String Lesen Sie GetValue schreiben SetValue;
Ende;
Durchführung
Ende.
Code -Implementierungseinheit der HTMLParser -Parsing -Klasse
Code
(********************************************************* *****)
(*Dexian Studio*)
(*HTML Parsing Unit Library*)
(**)
(*DxhtmlParser -Einheit*)
(*Copyright (C) 2008-2010 NO Idle*)
(*E -Mail: [email protected]: 75492895*)
(********************************************************* *****)
Einheit DXHTMLParser;
Schnittstelle
Verwendet Windows, MSHTML, ActiveX, dxHtmlelement, Formulare;
Typ
TdxhtmlParser = Klasse
Privat
Fhtmldoc: ihtmldocument2;
FHTML: String;
FWEBTables: tdxtableCollection;
Fwebelements: tdxwebelementCollection;
FWebcomb: tdxwebcombobox;
Prozedur Sethtml (const Value: String);
Funktion getWebcombobox (Aname: String): tdxWebcombobox;
öffentlich
Konstruktor erstellen;
Zerstörer zerstören; überschreiben;
Eigenschaft HTML: String lesen FHTML Schreiben Sie Sethtml;
Eigenschaftswebtabellen: tdxtableCollection lesen FWebtables;
Eigenschaftswebelemente: TDXWebelementCollection lesen FWEBElements;
Eigenschaft webcombobox [Name: String]: tdxwebcombobox lesen GetWebcombobox;
Ende;
Durchführung
{TdxhtmlParser}}
Konstruktor tdxhtmlParser.create;
Beginnen
Coinitialize (NIL);
// IHTMLDOCUMENT2 -Schnittstelle erstellen
Cocreateinstance (class_htmldocument, nil, clsctx_inproc_server, iid_ihtmldocument2, fhtmldoc);
Assert (fhtmldoc <> nil, 'Build htmldocument interface fehlgeschlagen');
Fhtmldoc.set_designMode ('on');
Während nicht (fhtmldoc.readystate = 'komplett'))
Beginnen
Schlaf (1);
application.ProcessMessages;
Ende;
FWEBBTABLE: = TDXTABLECollection.create (fhtmldoc);
FWebelements: = tdxwebelementCollection.create (nil);
FWebcomb: = tdxwebcombobox.create (nil);
Ende;
destructor tdxhtmlparser.destroy;
Beginnen
FWebtables.free;
Fwebelements.free;
Fwebcomb.free;
Beratung;
geerbt;
Ende;
Funktion tdxhtmlParser.getWebcombobox (Aname: String): tdxWebcombobox;
Beginnen
Wenn fwebelements.collection <> nil dann
Beginnen
Fwebcomb.combinterface: = fwebelements.elementByName [Aname] As ihtmlSelectElement;
Ergebnis: = FWebcomb;
Ende
sonst Ergebnis: = nil;
Ende;
procedure tdxhtmlParser.sethtml (const value: String);
Beginnen
Wenn fhtml <> Wert dann
Beginnen
FHTML: = Wert;
Fhtmldoc.body.innerhtml: = fhtml;
Fwebelements.collection: = fhtmldoc.all;
Ende;
Ende;
Ende.