3

我正在尝试获取 Internet Explorer Web 浏览器窗口的文本内容。

我正在执行以下步骤:

  1. 获得指向 IHTMLDocument2 的指针
  2. 从 IHTMLDocument2 我将主体作为 IHTMLElement
    3. 在主体上我调用 get_innerText

编辑


  1. 我获得了 body 的所有孩子,并尝试对所有 IHTMLElements 进行递归调用
  2. 如果我得到任何不可见的元素,或者如果我得到一个标签是脚本的元素,我会忽略该元素及其所有子元素。

我的问题是

  1. 除了页面上可见的文本外,我还获得了具有 which style="display: none"的内容
  2. 对于 google.com,我还获得了 javascript 和文本。

我尝试了一种递归方法,但我不知道如何处理这样的场景,

<div>
Hello World 1
<div style="display: none">Hello world 2</div>
</div>

在这种情况下,我将无法获得“Hello World 1”

谁能帮我找出从 IHTMLDocument2* 获取文本的最佳方法。我正在使用 C++ Win32,没有 MFC,ATL。

谢谢,阿希什。

4

1 回答 1

6

如果您在document.body.all元素上向后迭代,您将始终从里到外在元素上行走。所以你不需要自己走递归。DOM 会为你做这件事。例如(代码在 Delphi 中):

procedure Test();
var
  document, el: OleVariant;
  i: Integer;
begin
  document := CreateComObject(CLASS_HTMLDocument) as IDispatch;
  document.open;
  document.write('<div>Hello World 1<div style="display: none">Hello world 2<div>This DIV is also invisible</div></div></div>');
  document.close;
  for i := document.body.all.length - 1 downto 0 do // iterate backwards
  begin
    el := document.body.all.item(i);
    // filter the elements
    if (el.style.display = 'none') then
    begin
      el.removeNode(true);
    end;
  end;
  ShowMessage(document.body.innerText);
end;

旁注: 至于您使用递归方法的场景:

<div>Hello World 1<div style="display: none">Hello world 2</div></div>

例如,如果我们的元素是第一个 DIV,el.getAdjacentText('afterBegin')将返回"Hello World 1"。所以我们可能可以向前迭代元素并收集元素getAdjacentText('afterBegin'),但这有点困难,因为我们需要测试每个元素的父元素el.currentStyle.display

于 2012-04-09T09:19:12.250 回答