2012-04-10 173 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