2016-04-22 43 views
1

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

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

这里的问题是,它需要在10分钟内返回的结果,我想如此这般更快地拉近什么是搜索的范围和不返回不需要的元素。

作为一个例子,我只想搜索下面图片中突出显示的元素,而不是在下面的文件夹中搜索。有没有一种方法可以指定只查看“常规”文件夹?

任何和所有的帮助表示赞赏。谢谢。

感谢您的答复,我将尝试执行的XPath。对于它的价值,这里是HTML的屏幕截图。 #1是“常规”文件夹的元素。 #2是该文件夹中的第一个文档元素。 enter image description here

更新:尝试Frodo在Chrome检查器的$常规文件夹中调用.getElementsByTagName()的方法。下面是结果的截图:

enter image description here

+1

Xpath是一种可能更好的替代方法,但是如果不看代码(html)就不可能编写样本。 –

+0

感谢您的回复。我会尝试实现XPath,但是我会遇到一些麻烦。我在原始文章中添加了我的html截图。 – Quanda

+0

如果你想玩'SelectNodes()'和xpath,你需要用ex替换IE的COM对象。 HTML敏捷包 –

回答

0

已解决。相反,引用$conventional文件夹(我发现没有“TD” NodeDocuments儿童),我创建了一个新$DocContainer指向其确实有NodeDocuments儿童div元素:

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

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

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

特别感谢的Frode F.给我的想法来引用新的元素实际上是父容器。

对于其他类似问题:

铬督察/控制台来测试您的元素是DOM树中的空子。 Chrome的内置检查器/控制台非常强大,可以节省大量时间和麻烦。诸如.parentNode,.nextSibling,childNodes之类的方法是DOM遍历的关键。希望这可以帮助。

+1

很高兴听到您找到解决方案! :-)快速评论:这真的只是一个重复的答案。唯一的区别是你访问容器节点的方式,这对你的系统是唯一的,不能被其他人重用。这就是为什么我说你可能需要尝试不同的容器点才能实现它。 SO上的答案也会使未来的读者受益,所以这就是“游戏计划”,就是这里的解决方案。 –

3

如何首先定位容器节点的里面搜索?这会把你限制在前。 5 td - 需要通过where-object进行过滤的节点,而不是您现在可能拥有的1000+。

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

谢谢弗罗德。我现在会试试这个 – Quanda

+0

嗯,不工作。当我尝试这种方法时,'$ documents'返回为空。你确定你可以打电话给'。getElementsByTagName()'在div元素上?我会认为它会工作,但它不是 – Quanda

+0

你确定'$常规'找到节点?我在容器的id中输入了一个错字,因此请将其从源代码复制以确保安全。或者你可以尝试将'$ conventional'设置为表格元素或其他类型的节点来包装你感兴趣的td元素。我在一个随机的网站上测试了它,并在'$ conventional'中使用了一个container-div,并使用'$ conventional.getElementsbyTagName(“a”)'获取所有链接。 –