我在程序里对TWebBrower控件打开一个网页,上面有一些表格的数据,请问如何对表格里的数据进行分析?比如将表格里面符合条件的数据在界面上显示或者存储到数据库里。关键里如何进行分析。
在网上找到可以对输入框,提交按钮进行处理的代码,是用IHTMLInputelement来实现,但具体到对表格的没有,请各位高人指点。
我现在的实现方法,是将网页的源文件保存在一个本地文件里,然后对本地文件进行分析,但这样有个不好的地方就是保存下来的文件有时会有错位或多出几个字符,对表格的分析经常会有误差。而且效率也不是很高。
在网上找到可以对输入框,提交按钮进行处理的代码,是用IHTMLInputelement来实现,但具体到对表格的没有,请各位高人指点。
我现在的实现方法,是将网页的源文件保存在一个本地文件里,然后对本地文件进行分析,但这样有个不好的地方就是保存下来的文件有时会有错位或多出几个字符,对表格的分析经常会有误差。而且效率也不是很高。
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;
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;
返回值是node.innerText的仅仅返回了文本,不包含html标签
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;
麻烦你关注了一下我另外一个帖子的内容,谢谢
http://community.csdn.net/Expert/topic/5033/5033943.xml?temp=.5179865
关于验证码的问题----我只想获得当前打开页面的的验证码图片!!!