hubdog请进,关于取IE网页源文件的问题(100分)

  • 主题发起人 主题发起人 lqy169
  • 开始时间 开始时间
L

lqy169

Unregistered / Unconfirmed
GUEST, unregistred user!
我查了很久,论坛上关于取IE中网页源文件的方法有 五
1
doc:=webbrowser1.document as ihtmldocument2;
all:=doc.all;
item:=all.item(0,varEmpty);
Memo1.Clear;
memo1.Lines.Add(item.innerhtml);//item.innerhtml就是源文件内容
这种方法我最不明白,我这样做一点内容都没有,就是 ''

2
for i:=1 to webbrower.document.all.length-1 do
memo1.lines.add(webbrower.document.all.item(i).outerHTML);
这个最离谱,大家试试就知道

3
var HTMLDocument: IHTMLDocument2;
PersistFile: IPersistFile;
begin
...
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
Persist := HTMLDocument as IPersistFile;
Persist.Save(StringToOleStr('test.htm'), True);
while HTMLDocument.readyState <> 'complete' do
Application.ProcessMessages;
这就是hubdog大虾的答案了,也是我见过最好的方法,但是有个问题
在 webbrowser在的document可以找到 IPersistFile 接口
但在 IE 中得到的 document 接口却找不到 IPersistFile 接口

4
var
IpStream: IPersistStreamInit;
begin
with browser1 do
begin
while ReadyState <> READYSTATE_COMPLETE do
Forms.Application.ProcessMessages;
if Assigned(Document) then
begin
IpStream := Document as IPersistStreamInit;
Result := IpStream.save(TStreamAdapter.Create(AStream), TRUE);
end else Result := S_FALSE;
end;
end;
这个也是hubdog大虾的答案了,也是很好的方法,特别是
TStreamAdapter.Create(AStream) 这句用得很精采
但同样在 IE 中得到的 document 接口却找不到 IPersistStreamInit 接口

5
Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml);
这个方法看来最简单,但得到的源文件是不完整的,只能得到
<body> 到 </body>中的内容,前和后的内容都没有

以上5利方法都不能从IE中得到网页源文件,请问hubdog大虾还有什么方法
(和发现 IE中得到的 document 和 webbrowser 得到的有很多不同的地方)


 
我也很想知道这方面的问题。我想开发的软件要和ie结合,最基本就是要得到html的源代码,
其次是能模拟人填写一些内容(要真让人看到填写的内容,而不是通过讲内容发到该cgi程序
来模拟实现)。
我很笨,连用什么搜索关键词都不知道,或者在这里哪个版提问。各位前辈,能告诉我有什么
网站、论坛或者书籍资料吗?
 
你真的想知道吗? :)

http://www.euromind.com/iedelphi/embeddedwb.htm
 
先谢谢!这个的确挺有用,不过英文看起来有点头疼。有中文的吗?
 
我也只能得到<body> 到 </body>中的内容,关注
 
http://www.euromind.com/iedelphi
IEDownload:TIEDownload

procedure TForm1.IEDownload1Complete(Sender: TBSCB; Stream: TStream;
Result: HRESULT);
var Buffer: PByte;
begin
if (Result = S_OK) then
begin
stream.Position:=0;
memo1.lines.LoadFromStream(Stream);
end
else
memo1.lines.add(Errortext(Result) + ' ' + ResponseCodeText(Sender.ResponseCode));
end;
 
下面这个能读 text/html 和 text/plain, 但是 xml 或 binary 不灵,期待更好的办法

function GetHtml(const WebBrowser: TWebBrowser): string;
const
BufSize = $10000;
var
Size: Int64;
Stream: IStream;
hHTMLText: HGLOBAL;
psi: IPersistStreamInit;
begin
if not Assigned(WebBrowser.Document) then Exit;
OleCheck(WebBrowser.Document.QueryInterface (IPersistStreamInit, psi));
try
//OleCheck(psi.GetSizeMax(Size));
hHTMLText := GlobalAlloc(GPTR, BufSize);
if 0 = hHTMLText then RaiseLastWin32Error;
OleCheck(CreateStreamOnHGlobal(hHTMLText, True, Stream));
try
OleCheck(psi.Save(Stream, False));
Size := StrLen(PChar(hHTMLText));
SetLength(Result, Size);
CopyMemory(PChar(Result), Pointer(hHTMLText), Size);
finally
Stream := nil;
end;
finally
psi := nil;
end;
end;
 
怎么我运行时老是提示说未定义ipersiststreaminit,istream的?
 
奇怪,我用D7,IHTMLDocument2这个定义找不到,怎么回事啊
 
to intrain 要uses mshtml

 
楼主你用什么方法得到的IE的IHTMLDocument2接口?我用BHO得到的,试验了一下3,4,都没问题啊
 
后退
顶部