2016-04-22 41 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」)'獲取所有鏈接。 –