其他分享
首页 > 其他分享> > c – 从IHTMLDocument2 *获取页面上的可见文本

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

作者:互联网

我试图获取Internet Explorer Web浏览器窗口的文本内容.

我遵循以下步骤:

>获取指向IHTMLDocument2的指针
>从IHTMLDocument2我获取身体作为IHTMLElement
 3.在身体上我调用get_innerText

编辑

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

我的问题是

>以及在页面上可见的文本我也获得了具有哪种style =“display:none”的内容
>对于google.com,我还会获得javascript以及文本.

我尝试了一种递归方法,但我对如何处理这样的场景毫无头绪,

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

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

任何人都可以帮助我以最好的方式从IHTMLDocument2 *获取文本.
我使用的是C Win32,没有MFC,ATL.

谢谢,
阿希什.

解决方法:

如果你在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的每个元素的父元素.

标签:ole,mshtml,c,winapi,html-parsing
来源: https://codeday.me/bug/20190826/1729846.html