从IHTMLDocument2 *获取页面上的可见文本

时间:2012-04-06 06:06:12

标签: c++ winapi html-parsing ole mshtml

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

我正在遵循以下步骤:

  1. 获取指向IHTMLDocument2的指针
  2. 来自IHTMLDocument2的
  3. 我获取身体作为IHTMLElement
    3.在身体上我调用get_innerText
  4. 编辑


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

      1. 除了在页面上显示的文字外,我还会获得 style =“display:none”
      2. 的内容
      3. 对于google.com,我还会获得javascript以及文字。
      4. 我尝试了一种递归方法,但我对如何处理这样的场景毫无头绪,

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

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

        任何人都可以帮助我找到从IHTMLDocument2 *获取文本的最佳方法。 我使用的是C ++ Win32,没有MFC,ATL。

        谢谢, 与Ashish。

1 个答案:

答案 0 :(得分: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的每个元素的父元素。