如何通过WebBrowser控件(ActiveX InternetExplorer)获取页面的源代码?

6
如何通过WebBrowser控件(ActiveX InternetExplorer)获取页面的源代码?
我有一个名为“foo.xml”的xml文档。
var
 Web: TWebBrowser;
begin
 ...
 Web.Navigate("foo.xml");
 // How can I get source code thru WebBrower control<----
 ...
end;

难道不就是 foo.xml 文件的内容吗?你不是可以直接加载它吗? - Rob Kennedy
我认为那可能是一个例子。 - Toby Allen
XML 是 Http 请求的结果,不是文件。 - user82002
7个回答

1

WebBrowser1.Navigate()将其加载到RAD组件窗口中,使用Windows操作系统中内置的IE组件。您需要响应回调(对于浏览器组件,双击OnDownloadComplete事件),并在该函数中将其保存到文件中。以下是工作代码的片段:

procedure TMainForm.WB_SaveAs_HTML(WB : TWebBrowser; const FileName : string) ;
var
   PersistStream: IPersistStreamInit;
   Stream: IStream;
   FileStream: TFileStream;
begin
   if not Assigned(WB.Document) then
   begin
     Logg('Document not loaded!') ; //'Logg' adds a line to a log file.
     Exit;
   end;

   PersistStream := WB.Document as IPersistStreamInit;
   FileStream := TFileStream.Create(FileName, fmCreate) ;
   try
     Stream := TStreamAdapter.Create(FileStream, soReference) as IStream;
     if Failed(PersistStream.Save(Stream, True)) then ShowMessage('SaveAs HTML fail!') ;
   finally
     FileStream.Free;
   end;

end; (* WB_SaveAs_HTML *)

procedure TMainForm.WebBrowser1DownloadComplete(Sender: TObject);
begin
   if (WebBrowser1.Document<>nil)AND NOT(WebBrowser1.busy) then begin
       WB_SaveAs_HTML(WebBrowser1,'test.html');
       //myStringList.loadFromFile('test.html');   //process it.
   end;
end;

请注意,一些 MIME(“文件”)类型,如 JSON,在 IE 中会弹出“另存为...”对话框,这会停止您的阅读并需要手动干预。

1
private void btnTest_Click(object sender, EventArgs e)
        {
            wbMain.Navigate("foo.xml");
            wbMain.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(testing);
        }

        private void testing(Object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            test = wbMain.DocumentText;
        }

我知道有点晚了,但这对我有效。wbMain是WebBrowser对象。


1

我以为这很容易,但似乎已经被遗忘了。不过你可以轻松地使用TidHTTP控件来完成。

MyPage := IdHTTP1.Get('www.google.com');

我知道这不是你想要的,但可能会有所帮助。


1
IHTMLDocument2(Web.Document).Body.InnerHTML;

这应该返回页面的源代码。


那样做不会省略HEAD元素以及开头和结尾的BODY标签吗? - Rob Kennedy
我猜你是对的。 也许这可以帮到你: http://www.delphidabbler.com/articles?article=14 - corné

1

如需通过您的WebBrowser控件访问整个页面的HTML,请使用以下方法:

Web.Document.All[0].OutterHtml;

1
在DocumentCompleted事件中,查看WebBrowser控件的DocumentText属性。它应该包含加载页面的完整文本。

我在 Delphi 2005 中没有看到这样的属性。它是在以后的版本中引入的吗? - Rob Kennedy

1
另一种有效的方法是使用Synapse。使用Synapse调用HttpGet来检索您的初始资源(它会给您源代码),然后根据需要进行操作。
另一个选择是使用EmbeddedWB组件,它比标准的Delphi组件公开了更多的Web浏览器属性和功能,并且仍然符合您在Web浏览器中执行操作的要求。

是的,但我想知道如何仅通过ActiveX来实现这一点。 - user82002
我相信EmbeddedWB组件包装了IE,并包含完整的源代码。这是一个很好的起点,可以看到它是如何完成的。 - skamradt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接