最近、私は多くの場合、Webページのソースコードに戻り、その後、HTMLのさまざまな要素を解析する必要があります検索で、HTMLParserクラスのDelphiバージョンをいくつか見つけましたが、いくつかのライブラリを使用しようとしましたが、解析は不完全であり、いくつかの問題が発生しました。そのため、インターフェイスにブラウザがある場合、Webブラウザーのドキュメントインターフェイスを介してWebページ要素を操作できると思いました。これは非常に便利です。ただし、Webページの提出物は、Webbrowserを使用せずにHTMLを直接解析する方法が必要です内部のオブジェクトは、それを解析し、MSDNを検索した後にHTMLを実現でき、それをGoogleで検索してください、それは機能し、構築方法は次のとおりです。
// ihtmldocument2インターフェイスを作成します
cocreateinstance(class_htmldocument、nil、clsctx_inproc_server、iid_ihtmldocument2、fhtmldoc);
インターフェイスが作成された後、ドキュメント要素を解析できます。これは非常に爽やかです!
独自のオペレーションを組み合わせて、コンボボックス、テーブル、フレームなどのWebページ要素をカプセル化し、htmlparserを実装しました。
ここでは宣言のみが宣言されています。最後にコードをダウンロードしてください
コード
(********************************************* *****)
(*Dexian Studio*)
(*Webページ要素操作クラスライブラリ*)
(**)
(*dxhtmLelementユニット*)
(*Copyright(c)2008-2010アイドルなし*)
(*電子メール:[email protected]:75492895*)
(********************************************* *****)
ユニットDXHTMLELEMENT;
インタフェース
Windows、Sysutils、Clipbrd、Mshtml、ActiveX、Olectrls、Graphics、Typinfoを使用します。
{要素タイプを取得}
関数Isselectelement(Eleelement:Ihtmlelement):boolean;
関数ispwdelement(eleelement:ihtmlelement):boolean;
関数ISTextElement(要素:ihtmLelement):boolean;
関数ISTableElement(要素:ihtmlelement):boolean;
関数ISELEMENTCOLLECTION(要素:IHTMLelement):Boolean;
関数ischkelement(要素:ihtmLelement):boolean;
関数isradiobtnement(要素:ihtmLelement):boolean;
関数ismemoelement(要素:ihtmlelement):boolean;
関数isformelement(要素:ihtmlelement):boolean;
関数isimgelement(要素:ihtmlelement):boolean;
関数isinimgelement(要素:ihtmLelement):boolean;
関数islabelelement(要素:ihtmlelement):boolean;
関数islinkelement(要素:ihtmLelement):boolean;
関数islistelement(要素:ihtmlelement):boolean;
関数isControLElement(要素:ihtmLelement):boolean;
関数IsobjectElement(要素:ihtmLelement):boolean;
関数isFrameElement(要素:ihtmLelement):boolean;
関数isinputbtnement(要素:ihtmlelement):boolean;
関数isinhiddenelement(要素:ihtmLelement):boolean;
関数IssubmitElement(要素:ihtmlelement):boolean;
{imgelementデータを取得}
function getPicIndex(doc:ihtmldocument2; src:string; alt:string):integer;
function getPicelement(doc:ihtmldocument2; imgname:string; src:string; alt:string):ihtmlimgelement;
関数getRegCodepic(doc:ihtmldocument2; imgname:string:string; alt:string):tpicture;
関数getRegCodepic(doc:ihtmldocument2; index:integer):tpicture;
関数getRegCodepic(doc:ihtmldocument2;要素:ihtmlimgelement):tpicture; overload;
タイプ
tobjectfromlresult = function(lresult:lresult; const iid:tiid; 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);
function getElementType(要素:IHTMLELEMENT):TELEMENTTYPE;
関数getElementTypename(要素:ihtmLelement):string;
関数gethtmltablecell(atable:ihtmltable; arow、acol:integer):ihtmlelement;
関数gethtmltable(adoc:ihtmldocument2; aindex:integer):ihtmltable;
関数getWebBrowserhtmlTableCellText(doc:ihtmldocument2;
const tableindex、rowindex、colindex:integer; var resvalue:string):boolean;
関数gethtmltablerowhtml(atable:ihtmltable; arow:integer):ihtmlelement;
関数getWebBrowserhtmltableCellhtml(doc:ihtmldocument2;
const tableindex、rowindex、colindex:integer; var resvalue:string):boolean;
関数gehtmltablehtml(atable:ihtmltable; arow:integer):ihtmLelement;
関数getWebBrowserhtmltablehtml(doc:ihtmldocument2;
const tableindex、rowindex:integer; var resvalue:string):boolean;
タイプ
tdxwebframecollection = class;
tdxwebelementCollection = class;
tloadstate =(doc_loading、doc_completed、doc_invalidate);
tdxwebframe = class
プライベート
fframe:ihtmlwindow2;
FelementCollections:tdxwebelementCollection;
fwebframecollections:tdxwebframecollection;
関数getSrc:string;
function getElementCount:integer;
関数GetWebFrameCollections:TDXWebFrameCollection;
関数GetElementCollections:tdxwebelementCollection;
関数getDocument:ihtmldocument2;
関数getReadState:tloadState;
function getisLoaded:boolean;
手順SetFrame(const Value:ihtmlwindow2);
関数getName:string;
公共
Constructor create(iframe:ihtmlwindow2);
破壊者破壊;オーバーライド。
プロパティフレーム:ihtmlwindow2 fframe write setframeを読み取ります。
プロパティSRC:文字列読み取りgetSrc;
プロパティドキュメント:ihtmldocument2 read getDocument;
プロパティ名:文字列読み取りgetName;
プロパティフレーム:tdxwebframecollection read getWebFrameCollections;
Property ElementCount:integer read getElementCount;
プロパティElementCollections:tdxwebelementCollection read getElementCollections;
プロパティReadyState:tloadState read getReadState;
プロパティISLOADED:boolean read getisLoaded;
終わり;
tdxwebframecollection = class
プライベート
fframecollection:ihtmlframescollection2;
フレーム:tdxwebframe;
関数getCount:integer;
関数getFrameInterfaceByIndex(index:integer):ihtmlwindow2;
関数getFrameInterfaceByName(name:string):ihtmlwindow2;
関数getFrameByIndex(index:integer):tdxwebframe;
関数getFrameByname(name:string):tdxwebframe;
手順SetFrameCollection(const Value:ihtmlFramesCollection2);
公共
Constructor Create(Acollection:IHTMLFRAMESCOLLECTION2);
破壊者破壊;オーバーライド。
プロパティフレームコレクション:ihtmlframecollection2 read fframecollection write setframecollection;
プロパティカウント:Integer Read getCount;
Property FrameInterfaceByIndex [index:integer]:ihtmlwindow2 read getFrameInterfaceByIndex;
プロパティFrameInterfaceByName [名前:文字列]:ihtmlwindow2 read getFrameInterfaceByName;
Property FrameByIndex [index:integer]:tdxwebframe read getFrameByIndex;
Property FrameByName [名前:文字列]:tdxwebframe read getFrameByName;
終わり;
tdxwebelementCollection = class
プライベート
fcollection:ihtmLelementCollection;
fchildCollection:tdxwebelementCollection;
関数getCollection(index:string):tdxwebelementCollection;
関数getCount:integer;
function getElement(itemname:string; index:integer):ihtmlelement;
function getElementByName(itemName:string):ihtmLelement;
関数getElementByIndex(index:integer):ihtmlelement;
手順SetCollection(const Value:IHTMLELEMENTCOLLECTION);
公共
Constructor Create(Acollection:ihtmLelementCollection);
破壊者破壊;オーバーライド。
プロパティコレクション:ihtmlelementCollection read fcollection write setCollection;
Property ChildElementCollection [index:string]:tdxwebelementCollection read getCollection;
Property ElementCount:integer read getCount;
プロパティ要素[itemname:string; index:integer]:ihtmlelement read getelement;
Property ElementByName [itemName:string]:ihtmLelement read getElementByName;
Property ElementByIndex [index:integer]:ihtmlelement read getElementByIndex;
終わり;
tlinkCollection = class(tdxwebelementCollection)
終わり;
tdxwebtable = class;
tdxtableCollection = class
プライベート
ftableCollection:ihtmlelementCollection;
fdocument:ihtmldocument2;
fwebtable:tdxwebtable;
function getTableInterfaceByName(aname:string):ihtmltable;
手順setDocument(value:ihtmldocument2);
関数getTableInterfaceByIndex(index:integer):ihtmltable;
関数getCount:integer;
function getTableByIndex(index:integer):tdxwebtable;
function getTableByName(aname:string):tdxwebtable;
公共
Constructor create(doc:ihtmldocument2);
破壊者破壊;オーバーライド。
プロパティTableInterfaceByName [aname:string]:ihtmltable read getTableInterfaceByName;
プロパティTableInterfaceByIndex [index:integer]:ihtmltable read getTableInterfaceByIndex;
Property TableByname [aname:string]:tdxwebtable read gettablebyname;
Property TableByIndex [index:integer]:tdxwebtable read gettablebyindex;
プロパティドキュメント:ihtmldocument2読み取りfdocument write setdocument;
プロパティカウント:Integer Read getCount;
終わり;
tdxwebtable = class
プライベート
ftableinterface:ihtmltable;
関数getRowCount:integer;
手順SetableInterface(const値:ihtmltable);
関数getCell(ACOL、AROW:integer):string;
関数getRowColcount(rowindex:integer):integer;
関数getinnerhtml:string;
関数getInnertext:string;
関数getCellElement(ACOL、AROW:integer):ihtmltableCell;
公共
コンストラクターCreate(atable:ihtmltable);
プロパティテーブルインターフェイス:ihtmltable read ftableinterface write setable interface;
Property RowCount:integer read getRowCount;
プロパティセル[ACOL:INTEGER; AROW:INTEGER]:String Read GetCell;
プロパティセクレルメント[ACOL:INTEGER; AROW:INTEGER]:IHTMLTABLECELL read getCelellement;
Property RowColcount [RowIndex:Integer]:整数read getRowColcount;
Property Intherhtml:string read getinnerhtml;
Property Inrertext:string read getinnertext;
終わり;
tdxwebcombobox = class
プライベート
fhtmlselect:ihtmlselectelement;
関数getCount:integer;
手順setItemindex(const value:integer);
関数getItemindex:integer;
関数getName:string;
手順setName(const値:文字列);
関数getValue:string;
手順setValue(const値:文字列);
手順setcombinterface(const値:ihtmlselectelement);
関数getItembyName(ELENAME:STRING):String;
関数getItembyIndex(index:integer):string;
関数getIteMattribute(index:integer; attribname:string):olevariant;
公共
Constructor Create(Awebcombo:ihtmlselectelement);
手順ADD(ELE:IHTMLELEMENT);
手順挿入(ELE:IHTMLELEMENT; index:integer);
手順削除(index:integer);
プロパティコンバインターフェイス:ihtmlselectelement read fhtmlselect write setcombinterface;
プロパティカウント:Integer Read getCount;
Property ItemIndex:integer read getItemindex write setItemindex;
Property ItemByIndex [index:integer]:文字列読み取りgetItembyIndex;
Property ItemByName [ELENAME:文字列]:文字列read getItembyname;
Property ItemAttribute [index:integer; attribname:string]:olevariant read getItemattribute;
プロパティ名:文字列read getname write setName;
プロパティ値:文字列読み取りgetValue write setValue;
終わり;
実装
終わり。
htmlparser解析クラスのコード実装ユニット
コード
(********************************************* *****)
(*Dexian Studio*)
(*HTML解析ユニットライブラリ*)
(**)
(*dxhtmlparser unit*)
(*Copyright(c)2008-2010アイドルなし*)
(*電子メール:[email protected]:75492895*)
(********************************************* *****)
ユニットdxhtmlparser;
インタフェース
Windows、MSHTML、ActiveX、DXHTMLELEMENT、フォームを使用します。
タイプ
tdxhtmlparser = class
プライベート
fhtmldoc:ihtmldocument2;
fhtml:string;
fwebtables:tdxtableCollection;
fwebelements:tdxwebelementCollection;
fwebcomb:tdxwebcombobox;
手順sethtml(const value:string);
関数getWebComboBox(ANAME:文字列):tdxwebcombobox;
公共
コンストラクターCREATE;
破壊者破壊;オーバーライド。
プロパティHTML:文字列read fhtml write sethtml;
プロパティwebtables:tdxtableecollection read fwebtables;
プロパティWebElements:tdxwebelementCollection read fwebelements;
プロパティWebComboBox [名前:文字列]:tdxwebcombobox read getwebcombobox;
終わり;
実装
{tdxhtmlparser}
コンストラクターtdxhtmlparser.create;
始める
coinitialize(nil);
// ihtmldocument2インターフェイスを作成します
cocreateinstance(class_htmldocument、nil、clsctx_inproc_server、iid_ihtmldocument2、fhtmldoc);
assert(fhtmldoc <> nil、 'htmldocumentインターフェイスをfailed failed');
fhtmldoc.set_designmode( 'on');
違います(fhtmldoc.readystate = 'complete')do
始める
睡眠(1);
application.processmessages;
終わり;
fwebtables:= tdxtableCollection.create(fhtmldoc);
fwebelements:= tdxwebelementCollection.create(nil);
fwebcomb:= tdxwebcombobox.create(nil);
終わり;
Destructor tdxhtmlparser.destroy;
始める
fwebtables.free;
fwebelements.free;
fwebcomb.free;
counitialize;
継承;
終わり;
function tdxhtmlparser.getWebComboBox(aname:string):tdxwebcombobox;
始める
fwebelements.collection <> nil thenの場合
始める
fwebcomb.combinterface:= fwebelements.elementbyname [aname] as ihtmlselectelement;
結果:= fwebcomb;
終わり
その他の結果:= nil;
終わり;
手順tdxhtmlparser.sethtml(const value:string);
始める
fhtml <>値の場合
始める
fhtml:= value;
fhtmldoc.body.innerhtml:= fhtml;
fwebelements.collection:= fhtmldoc.all;
終わり;
終わり;
終わり。