我在程序里对TWebBrower控件打开一个网页,上面有一些表格的数据,请问如何对表格里的数据进行分析?比如将表格里面符合条件的数据在界面上显示或者存储到数据库里。关键里如何进行分析。
在网上找到可以对输入框,提交按钮进行处理的代码,是用IHTMLInputelement来实现,但具体到对表格的没有,请各位高人指点。
我现在的实现方法,是将网页的源文件保存在一个本地文件里,然后对本地文件进行分析,但这样有个不好的地方就是保存下来的文件有时会有错位或多出几个字符,对表格的分析经常会有误差。而且效率也不是很高。

解决方案 »

  1.   

    我是这样用的,你参考参考,use MSHTML;function GetHtmlTableCell(aTable: IHTMLTable; aRow, aCol: Integer): IHTMLElement;
    var
      Row: IHTMLTableRow;begin
      Result := nil;
      if aTable = nil then Exit;
      if aTable.rows = nil then Exit;
      Row := aTable.rows.item(aRow, aRow) as IHTMLTableRow;
      if Row = nil then Exit;
      Result := Row.cells.item(aCol, aCol) as IHTMLElement;
    end;function GetHtmlTable(aDoc: IHTMLDocument2; aIndex: Integer): IHTMLTable;
    var
      list: IHTMLElementCollection;
    begin
      Result := nil;
      if aDoc = nil then Exit;
      if aDoc.all = nil then Exit;
      list := aDoc.all.tags('table') as IHTMLElementCollection;
      if list = nil then Exit;
      Result := list.item(aIndex,aIndex) as IHTMLTable;
    end;function GetWebBrowserHtmlTableCellText(const AWebBrowser: TWebBrowser;
      const TableIndex, RowIndex, ColIndex: Integer;
      var ResValue: string): Boolean;
    var
      Docintf: IHTMLDocument2;
      tblintf: IHTMLTable;
      node: IHTMLElement;
    begin
      ResValue := '';
      docintf := AWebBrowser.Document as IHTMLDocument2;
      tblintf := GetHtmlTable(docintf, TableIndex);
      node := GetHtmlTableCell(tblintf, RowIndex, ColIndex);
      Result := node <> nil;
      if Result then
        ResValue := Trim(node.innerText);
    end;function GetHtmlTableRowHtml(aTable: IHTMLTable; aRow: Integer): IHTMLElement;
    var
      Row: IHTMLTableRow;
    begin
      Result := nil;
      if aTable = nil then Exit;
      if aTable.rows = nil then Exit;
      Row := aTable.rows.item(aRow, aRow) as IHTMLTableRow;
      if Row = nil then Exit;
      Result := Row as IHTMLElement;
    end;function GetWebBrowserHtmlTableCellHtml(const AWebBrowser: TWebBrowser;
      const TableIndex, RowIndex, ColIndex: Integer;
      var ResValue: string): Boolean;
    var
      Docintf: IHTMLDocument2;
      tblintf: IHTMLTable;
      node: IHTMLElement;
    begin
      ResValue := '';
      docintf := AWebBrowser.Document as IHTMLDocument2;
      tblintf := GetHtmlTable(docintf, TableIndex);
      node := GetHtmlTableCell(tblintf, RowIndex, ColIndex);
      Result := node <> nil;
      if Result then
        ResValue := Trim(node.innerHTML);
    end;
    function GeHtmlTableHtml(aTable: IHTMLTable; aRow: Integer): IHTMLElement;
    var
      Row: IHTMLTableRow;
    begin
      Result := nil;
      if aTable = nil then Exit;
      if aTable.rows = nil then Exit;
      Row := aTable.rows.item(aRow, aRow) as IHTMLTableRow;
      if Row = nil then Exit;
      Result := Row as IHTMLElement;
    end;function GetWebBrowserHtmlTableHtml(const AWebBrowser: TWebBrowser;
      const TableIndex, RowIndex: Integer;
      var ResValue: string): Boolean;
    var
      Docintf: IHTMLDocument2;
      tblintf: IHTMLTable;
      node: IHTMLElement;
    begin
      ResValue := '';
      docintf := AWebBrowser.Document as IHTMLDocument2;
      tblintf := GetHtmlTable(docintf, TableIndex);
      node := GeHtmlTableHtml(tblintf, RowIndex);
      Result := node <> nil;
      if Result then
        ResValue := node.innerHtml;
    end;
      

  2.   

    postren(小虫) :谢谢你,你能不能给一些调用这些函数的例子?我试了几次都不行,是菜鸟了~~~~汗
      

  3.   

    主要用的是这3个函数
    GetWebBrowserHtmlTableCellText
    GetWebBrowserHtmlTableCellHtml
    GetWebBrowserHtmlTableHtml其他的函数是为这三个函数服务的,当然你也可以再扩展自己需要的函数
    如function GetWebBrowserHtmlTableCellText(const AWebBrowser: TWebBrowser;//浏览器
      const TableIndex, RowIndex, ColIndex: Integer;//表格索引,行索引,列索引
      var ResValue: string): Boolean; //ResValue表示获得的结果,返回值表示是否正确获得if GetWebBrowserHtmlTableCellText(WebBrowser1, 0, 0, 0, ResValue) then
    begin
      ShowMessage(ResValue);
    end else
    begin
      ShowMessage('指定的表格不存在');
    end;
      

  4.   

    另外返回值是node.innerHTML的表示是返回的是HTML字符串,包含html标签
    返回值是node.innerText的仅仅返回了文本,不包含html标签
      

  5.   

    postren(小虫) : 按你的方法,已经能够取到数据。但还有一个问题,对于嵌套的表格该如何处理?GetWebBrowserHtmlTableCellText 返回的数据是其中一个嵌套表格的全部数据。是不是我可以将ResValue再强制转成table类型,再来处理?这样的话,代码该如何写?
      

  6.   

    可以适当调整TableIndex/RowIndex/ColIndex获得任何表格的内容的
      

  7.   

    if GetWebBrowserHtmlTableCellText(WebBrowser1, 0, 0, 0, ResValue) then
    begin
      ShowMessage(ResValue);
    end else
    begin
      ShowMessage('指定的表格不存在');//这儿就是结束标志
    end;用while 循环保证能把所有表格都遍历一遍,具体内容的取舍就要考自己判断了
    procedure TForm1.Button2Click(Sender: TObject);
    var
      TableIndex, RowIndex, ColIndex: Integer;
      ResValue: string;
      B: Boolean;
    begin
      TableIndex := 0;
      RowIndex := 0;
      ColIndex := 0;
      B := True;
      while GetWebBrowserHtmlTableCellText(WebBrowser1, TableIndex, RowIndex, ColIndex, ResValue) do
      begin
        B := True;
        while B or GetWebBrowserHtmlTableCellText(WebBrowser1, TableIndex, RowIndex, ColIndex, ResValue) do
        begin
          B := True;
          while B or GetWebBrowserHtmlTableCellText(WebBrowser1, TableIndex, RowIndex, ColIndex, ResValue) do
          begin
            //处理ResValue
            Memo1.Lines.Add(ResValue);
            Inc(ColIndex);
            B := False;
          end;
          Inc(RowIndex);
          ColIndex := 0;
          B := False;
        end;
        Inc(TableIndex);
        RowIndex := 0;
      end;
    end;
      

  8.   

    好的,谢谢你的帮助。结贴了,呵呵。
    麻烦你关注了一下我另外一个帖子的内容,谢谢
    http://community.csdn.net/Expert/topic/5033/5033943.xml?temp=.5179865
    关于验证码的问题----我只想获得当前打开页面的的验证码图片!!!