如何提取含有iframe网页的表格数据

 我来答
吉祥二进制
高粉答主

2014-12-01 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84573

向TA提问 私信TA
展开全部

如何提取含有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('
);   
          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;


   另外:

  第一,用参考代码一的方法得到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写得软些也就很容易了..    

机皛原平松
2019-09-07 · TA获得超过3913个赞
知道大有可为答主
回答量:3114
采纳率:33%
帮助的人:412万
展开全部
如何提取含有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用字符串直接分析,那样得的数据都是空格。

大家有什么好办法。。

参考代码一:

1234567891011121314151617181920212223242526 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;

参考代码二:

12345678910111213141516171819 procedure Form1.Button1Click(Sender: TObject); var i,j : integer; GetTable : OleVariant; begin WebBrowser1.Navigate('); 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;

另外:

第一,用参考代码一的方法得到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写得软些也就很容易了..
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式