DelphiTwebbrowser如何提取含有iframe网页(HTML)的表格(table)数据--(转载) 如何提取含有iframe网页(HTML)的表格(table)数据 想提取网页里的表格(table标签)数据,因为session的原来,所以用了,但些网页被包含在一个iframe里,所以在论坛上找到了一高人的代码(参考代码一),用FrameWin.document.body.outerHTML得到了源码,但问题是,我想得到table表里的数据,好像没有FrameWin.document.all.tags('table').item(0).outerHTML这种形式,但WebBrowser却有.如参考代码二,因为要提取的网页的表格是通过另一同级iframe网页的javascript赋值的,所以不能直接通过FrameWin.document.body.outerHTML用字符串直接分析,那样得的数据都是空格。 大家有什么好办法。。 参考代码一: usr mshtml; procedure TMainForm.ToolButton56Click(Sender: TObject); var Index: Integer; Document: IHTMLDocument2; FrameIdx: OleVariant; FrameDis: IDispatch; FrameWin: IHTMLWindow2; begin while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages; if WebBrowser1.Document = nil then Exit; if WebBrowser1.Document.QueryInterface(IHTMLDocument2, Document) <> 0 then Exit; if Document.frames.length > 0 then begin for Index := 0 to Document.frames.length - 1 do begin FrameIdx := Index; FrameDis := Document.frames.item(FrameIdx); if FrameDis.QueryInterface(IHTMLWindow2, FrameWin) <> 0 then Exit; ShowMessage(FrameWin.document.body.outerHTML); //FrameWin.document 就是你要的每个 Frame 的文档 end; end; end; 参考代码二: procedure Form1.Button1Click(Sender: TObject); var i,j : integer; GetTable : OleVariant; begin WebBrowser1.Navigate('http://www./minalnew/MyHTML.htm'); while WebBrowser1.ReadyState < READYSTATE_INTERACTIVE do //頁面激活 Application.ProcessMessages; Memo1.Lines.Add(WebBrowser1.OleObject.Document.all.tags('table').item(0).outerhtml); GetTable:= WebBrowser1.OleObject.Document.all.tags('table').item(0); For i:=0 to (GetTable.Rows.Length-1) do begin For j:=0 to (GetTable.Rows.Item(i).Cells.Length-1) do begin Memo2.Lines.Add(GetTable.Rows.Item(i).Cells.Item(j).innerhtml); end; end; end;
解决了.不过是另开的一个贴子的办法解决的.爽. 方法见:http://community.csdn.net/Expert/topic/3537/3537880.xml?temp=.4540979 Top to:fayeflash(我爱阿菲) 第一,用参考代码一的方法得到iframe的HTML源代码,类型为IHTMLDocument, 第二,使用IHTMLTABLE,IHTMLRows,就可以正确得到网页表格数据了.就算表格数据是由javascript等脚本赋值也可以正确提出数据。 附:如何从IHTMLDocument2里提取<table>里的所以数据 不能用正则表达式,因为table中表格的值是通过另一网页用javascript动态赋值的。 好像 IHTMLDocument2没有WebBrowser1.document.all.tags('table').item(0).Rows.Item(i).Cells.Item(j).innerText这样的写法。 弄清楚下面的,要改写成用VARIANT写得软些也就很容易了.. uses mshtml; function GetHtmlTableCell(aTable:IHTMLTable;aRow,aCol:integer):IHTMLElement; var Row:IHTMLTableRow; node:IHTMLElement; begin Row:=aTable.rows.item(aRow,aRow) as IHTMLTableRow; Result:=Row.cells.item(aCol,aCol) as IHTMLElement; end; function GetHtmlTable(aDoc:IHTMLDocument2;aIndex:Integer):IHTMLTable; var list:IHTMLElementCollection; begin list:=aDoc.all.tags('table') as IHTMLElementCollection; Result:=list.item(aIndex,aIndex) as IHTMLTable; end; procedure TForm1.Button1Click(Sender: TObject); var Docintf:IHTMLDocument2; tblintf:IHTMLTable; begin docintf:=WebBrowser1.Document as IHTMLDocument2; tblintf:=GetHtmlTable(docintf,0); ShowMessage( GetHtmlTableCell(tblintf,1,1).innerText); end; 转自:http://wystec.blog.163.com/blog/static/29614447200882352454883/
|