我试图获取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的每个元素的父元素.