【问题标题】:Delphi TWebBrowser get HTML source after AJAX loadDelphi TWebBrowser 在 AJAX 加载后获取 HTML 源代码
【发布时间】:2014-03-19 20:51:08
【问题描述】:

我有以下函数在 DocumentComplete 事件之后获取 HTML 文档的源代码。

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

问题:页面上执行 AJAX 调用之前检索源代码。 页面完成加载(由 WebBrowser 确定),但 AJAX 继续修改 DOM 并且页面上出现了其他元素。 我需要的是相当于 Mozilla 的“查看生成的源代码”,或使用 Firebug 或 Chrome Inspector 或 IE 开发工具检查网页时出现的 html 源代码。

似乎在 C 中有 DocumentText property 做这件事,但在 Delphi 中找不到任何属性或方法来实现这一点。

有什么想法/提示/帮助吗?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    您可以使用IHTMLDocument2 接口,这是TWebBrowser.Document 实现的接口。该属性作为 IDispatch 公开,但您可以将其转换为接口或 (Ole)Variant,尽管您不会从代码完成中受益。

    IHTMLDocument2 接口支持 DocumentElement 属性,该属性指向文档的根元素。该元素(与任何其他元素一样)具有属性outerHTML,它将元素及其所有内容作为字符串提供:

    var
      d: OleVariant;
    begin
      d := WebBrowser1.Document;
      ShowMessage(d.documentElement.outerHTML);
    

    据我所知,这是文档的实际状态,包括 Javascript 所做的任何更改。

    它似乎不包含 doctype,但话又说回来,如果我通过 Webbrowser1.Document.All 找到 doctype 元素,那么它的 outerHTML 属性不会返回任何内容。文档的其他部分也发生了变化(其中一个是大写的标记名称),但这只能确认这是基于加载的 DOM 生成的文档结构,而不是文档的原始来源。

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      相关资源
      最近更新 更多