2012-04-10 171 views

回答

18

您可以使用IPersistStreamInit接口和save方法將Web瀏覽器的內容存儲在流中。

Uses 
    ActiveX; 

function GetWebBrowserHTML(const WebBrowser: TWebBrowser): String; 
var 
    LStream: TStringStream; 
    Stream : IStream; 
    LPersistStreamInit : IPersistStreamInit; 
begin 
    if not Assigned(WebBrowser.Document) then exit; 
    LStream := TStringStream.Create(''); 
    try 
    LPersistStreamInit := WebBrowser.Document as IPersistStreamInit; 
    Stream := TStreamAdapter.Create(LStream,soReference); 
    LPersistStreamInit.Save(Stream,true); 
    result := LStream.DataString; 
    finally 
    LStream.Free(); 
    end; 
end; 
+0

它的工作原理。非常感謝你。 – Leadri 2012-04-10 15:54:33

+0

我們如何才能使其工作的反向方式:SetWebBrowserHTML,從而重新注入以前提取的代碼回WebBrowser(或TEmbeddedWebBrowser)。我想象下面的情況:備忘錄組件用GetWebBrowserHTML獲取HTML源代碼,然後用戶對源代碼進行一些更改,然後將更改後的源代碼重新注入WebBrowser。這將成爲一個很棒的HTML編輯器,並在瀏覽器中進行實時預覽! – user1580348 2013-05-14 01:12:01

+1

更好:'LStream:= TStringStream.Create('',TEncoding.UTF8);' – user1580348 2013-05-20 10:17:20

3

這已經在Embarcadero論壇上多次提出和回答,併發布了大量代碼示例。搜索檔案。

它的要點是你Navigate()到所需的URL並等待OnDocumentComplete事件觸發,然後QueryInterface()Document屬性爲IPersistStreamInit接口並調用其save()方法。創建一個TStream對象實例(如TMemoryStream),將其包裝在一個TStreamAdapter對象中,然後將該適配器傳遞給save()。您可以根據需要將TStream加載到TMemo中。

4

那也是行之有效:

function GetHTML(w: TWebBrowser): String; 
Var 
    e: IHTMLElement; 
begin 
    Result := ''; 
    if Assigned(w.Document) then 
    begin 
    e := (w.Document as IHTMLDocument2).body; 

    while e.parentElement <> nil do 
    begin 
     e := e.parentElement; 
    end; 

    Result := e.outerHTML; 
    end; 
end; 
+0

錯了。這會讓你獲得'document'元素的DOM表示。它不會是HTML源代碼。 – kobik 2013-03-18 19:36:21

+0

是的,你是對的,我只是用它來解析一些可用的html源代碼數據,並使用DOM表示可以。 – 2013-03-20 03:42:31

+1

我會upvote你的答案,這在任何情況下都很有用。我也在我們的蜘蛛中使用類似的方法來處理/解析來自外國網站的HTML。 – kobik 2013-03-20 13:00:58