如何从 javascript 生成的 TWebBrowser 中提取用户可见的 HTML

How to extract user-visible HTML from a TWebBrowser that's generated by javascript

我正在使用 Delphi 的 TWebBrowser 组件加载一些我想解析的网页,它们使用 javascript (AJAX?) 来呈现用户-可见 HTML 代码。从这些页面 return 中提取 HTML 的有据可查的方法是一堆 javascript 而不是用户看到的内容。这里有对查询的响应可以追溯到 2004 年,它们都是 return javascript 而不是用户可见的 HTML。我见过一些建议使用替代方法访问数据的方法,但我无法使它们中的任何一个工作,我也不确定如何调整代码。

我的问题是,当我将网页加载到在 TWebBrowser 组件内部渲染后完全可读的 TWebBrowser 时,我如何提取最终在该组件内部渲染的 HTML可见,而不是生成它的 JS 代码?

就我而言,我正在尝试加载 Google 搜索结果页面,但我听说这也是许多新闻网站(如华尔街日报、WAPO 和纽约时报)中的一个问题。

var
  url: string;
  d: OleVariant;
begin
  // enter something like "dentist in baltimore" in a Google search,
  // then copy the contents of the ADDRESS field that it generates and
  // paste it here:
  url := '... paste URL Google generates here ...';
  WebBrowser1.Navigate2( url, 0 {nav_flags} );
  // I have an OnNavigate2 handler here, but I'm guessing this works as well  
  d := WebBrowser1.Document;
  memo1.Lines.Text := d.documentElement.outerHTML;

问题是,备忘录包含...而且它只是 HEAD 中的一堆 javascript。没有任何内容与此搜索实际向用户显示的 TWebBrowser 或浏览器 window 中的可见内容相似。

另一个论坛中有人建议这是一个时间问题,并用 OnDocumentComplete 替换我正在使用的 OnNavigationComplete2。实际上,我从未见过或听说过 OnDocumentComplete,也从未在任何示例中看到过它的使用。当然 none 已被简化为内联显示所有内容,因此不会出现时间问题。

但事实证明,这是本例中问题的症结所在,而不是 outerHTML:您需要调用一个在所有 javascript 完成 运行 后触发的事件,并且我相信 OnNavigationComplete2 做到了这一点。我的错。