分享

DelphiTwebbrowser如何提取含有iframe网页(HTML)的表格(table)数据

 quasiceo 2014-07-01

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/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多