在页面上查找元素而不搜索整个文档

时间:2016-04-22 18:21:06

标签: html powershell dom getelementsbytagname dom-traversal

为了提高性能,我想执行getElementsByTagName(“td”)而不搜索整个文档。有没有办法缩小搜索这些元素的范围?这是我的代码:

 $ie.Document.getElementsByTagName("td") | ? {($_.className -match 'NodeDocument') 

这个问题是返回结果需要10分钟以上,我想缩小搜索范围,以便更快,不会返回不需要的元素。

例如,我只想在下面的图像中搜索突出显示的元素,而不是在下面的文件夹中搜索。有没有办法指定只在'常规'文件夹中查看?

感谢任何和所有帮助。谢谢。

感谢您的回复,我将尝试实施XPath。它的价值在于,这是HTML的截图。 #1是'Conventional'文件夹的元素。 #2是文件夹中的第一个文档元素。 enter image description here

更新:尝试了Frodo在Chrome检查器中的$ conventional文件夹上调用.getElementsByTagName()的方法。以下是结果的屏幕截图:

enter image description here

2 个答案:

答案 0 :(得分:3)

如何首先找到容器节点并在其中搜索?这会限制你到前。 5 td - 需要通过where-object而非1000+过滤的节点,就像您现在可能拥有的那样。

$conventional = $ie.Document.getElementById('OurLibrary_LibTocUC$LandingPanel$toc1$ExpertTree1_nl_23')
$documents = $conventional.getElementsByTagName("td") | ? { $_.className -match 'NodeDocument' }

答案 1 :(得分:0)

解决。我没有引用$conventional文件夹(我发现它没有“td”NodeDocuments作为子项),而是创建了一个新的$DocContainer,它指向一个div元素,它将NodeDocuments作为子元素:

$DocContainer = $conventional.parentNode.parentNode.parentNode.parentNode.nextSibling

使用此$DocContainer我现在可以说:

$documents = $DocContainer.getElementsByTagName("td") | ? {($_.className -match 'NodeDocument')

特别感谢Frode F.让我想到引用一个实际上是父容器的新元素。

对于有类似问题的其他人:

利用chrome检查器/控制台来测试元素在DOM树中的位置。 Chrome的内置检查器/控制台非常强大,可以节省大量时间和麻烦。像.parentNode.nextSiblingchildNodes这样的方法是DOM遍历的关键。希望这会有所帮助。