【问题标题】:How can I get HTML source code from TWebBrowser如何从 TWebBrowser 获取 HTML 源代码
【发布时间】:2026-01-04 09:55:02
【问题描述】:

如何从 WebBrowser 组件中获取源代码?

我想在 WebBrowser 组件上获取活动页面的源代码并将其写入备忘录组件。

谢谢。

【问题讨论】:

    标签: delphi delphi-7 twebbrowser


    【解决方案1】:

    您可以使用IPersistStreamInit 接口和save 方法将Webbrowser 的内容存储在Stream 中。

    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;
    

    【讨论】:

    • 我们怎样才能让它以反向方式工作:SetWebBrowserHTML,从而将之前提取的代码重新注入 WebBrowser(或 TembeddedWebBrowser)。我想象以下情况:备忘录组件使用 GetWebBrowserHTML 获取 HTML 源代码,然后用户对源代码进行一些更改,然后将更改后的源代码重新注入 WebBrowser。这将是一个不错的 HTML 编辑器,可以在浏览器中实时预览!
    • 更好:LStream := TStringStream.Create('', TEncoding.UTF8);
    • @user1580348如果你想“反转”它,你只需要改变 LPersistStreamInit.Save 到 LPersistStreamInit.Load 并用一些东西初始化 TStringStream(或传入不同的流)。
    【解决方案2】:

    这也很好用:

        uses MSHTML;
    
        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;
    

    【讨论】:

    • 错了。这将为您提供document 元素的DOM 表示。它不会是 HTML 源代码。
    • 是的,你是对的,我只是用它来解析 html 源代码上可用的一些数据,使用 DOM 表示就可以了。
    • 我会赞成你的答案,它在任何情况下都很有用。我还在我们的蜘蛛中使用类似的方法来操作/解析来自外国网站的 HTML。
    • 我不得不对此投赞成票,因为我试图获取源代码的页面的内容已被 JavaScript 更改,因此@rruz 建议不起作用,因为它返回了原始 HTML 而不是更改后的.谢谢。
    【解决方案3】:

    Embarcadero 论坛中已多次询问和回答此问题,并发布了大量代码示例。搜索档案。

    它的要点是你 Navigate() 到所需的 URL 并等待 OnDocumentComplete 事件触发,然后 QueryInterface() IPersistStreamInit 接口的 Document 属性并调用其 save() 方法.创建TStream对象实例,如TMemoryStream,将其包装在TStreamAdapter对象中,然后将适配器传递给save()。然后,您可以根据需要将TStream 加载到TMemo 中。

    【讨论】:

      【解决方案4】:

      为什么不快速和肮脏:

      OnNavigateComplete2()
      
      Form1.RichEdit1.Text:=(WebBrowser1.OleObject.Document.documentElement.outerhtml);
      

      【讨论】:

      • 这个简单的版本在非 ASCII 文本的 UTF-8 编码页面上效果更好。