[3H] WebBrowser.Document (100分)

  • 主题发起人 主题发起人 3h
  • 开始时间 开始时间
3

3h

Unregistered / Unconfirmed
GUEST, unregistred user!
目的:得到某个页面的HTML原码(传送到浏览器的)
难点:该页面是一个动态页面,URL带有参数,如:http://www.sw163.com/new_vnetnews/local_words.asp?pclass=本地&sclass=&id=9387
计划:
(1)用WININET方法去取页面,不过失败了,原因不清楚,具体可看这里:http://www.delphibbs.com/delphibbs/dispq.asp?lid=2168093;
(2)用一个WebBrower打开后获取其HTML,这也是本帖子使用的方法。
我写了一小段代码:

代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://www.sw163.com/new_vnetnews/local_words.asp?pclass=本地&sclass=&id=9387');
  while WebBrowser1.Busy do
    application.ProcessMessages;
end;

在最后,页面能够被完美地在控件上打开,不过该控件的 Document 属性是这样描述的:

Delphi syntax:
property Document: IDispatch;

这种接口是怎么回事的,要怎么从这个中获取源HTML?
请朋友们不吝赐教,谢谢!
 
这样:
Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml);
 
www:
您的方法是不错,不过并不能返回最原始的HTML代码,经过OuterHTML之后,原有的许多代码都被重新格式化了,包括一些STYLE之类都被消化掉了,不忠于原著,不能算是满意的答案。
 
这就是你要的了: GetHTML(IHtmlDocument2(WebBrowser1.Document).Body);

function GetHTML(const ABody: IHTMLElement): string;
begin
Result := '';
if Assigned(ABody) then
try
if ABody.parentElement <> nil then
Result := ABody.parentElement.outerHTML
else
Result := ABody.outerHTML;
except
Result := ABody.outerHTML;
end;
end;
 
下面是两段程序,你参考一下
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;

function SaveToStream(AStream: TStream): HRESULT;
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;
 
pihome的稍为烦琐。
OK,谢谢大家,总算完成了。
 
后退
顶部