2016-04-22 2 views
1

Чтобы повысить производительность, я хотел бы выполнить getElementsByTagName ("td"), не выполняя поиск по всему документу. Есть ли способ сузить область поиска этих элементов? Вот мой код:Найти элементы на странице без поиска всего документа

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

Проблема с этим состоит в том, что она занимает более 10 минут, чтобы вернуть результаты, и я хотел бы, чтобы сузить сферу того, что ищется так оно идет быстрее, и не возвращает нежелательные элементы ,

В качестве примера я хочу только найти выделенные элементы на изображении ниже, а не в папках выше. Есть ли способ указывать только на просмотр «Обычной» папки?

Любая помощь приветствуется. Спасибо.

Спасибо за ответы, я буду стараться реализовать XPath. Для чего стоит, вот скриншот HTML. # 1 является элементом «Обычной» папки. # 2 - первый элемент документа внутри папки. enter image description here

Обновление: Пробовал метод вызова .getElementsByTagName() в обычной папке в инспекторе Chrome. Вот скриншот результата:

enter image description here

+1

Xpath - альтернатива, которая может работать лучше, но невозможно написать образец, не видя код (html). –

+0

Спасибо за ответ. Я постараюсь реализовать XPath, но я столкнулся с некоторыми проблемами. Я добавил скриншот моего html к исходному сообщению. – Quanda

+0

Если вы хотите играть с 'SelectNodes()' и xpath, вам нужно будет заменить COM-объект IE ex. HTML Agility Pack –

ответ

0

Решено. Вместо ссылки на $conventional папку (которую я узнал, не имеет «ТД» NodeDocuments как дети), я создал новый $DocContainer, который указывает на сНу элементы, которые не имеют NodeDocuments как дети:

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

Использование это $DocContainer теперь я могу сказать:

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

Особое спасибо Фрод Ф. за предоставленную мне мысль сделать ссылку на новый элемент, который на самом деле является родительским контейнером.

Для других людей с подобными проблемами:

Воспользоваться хромовым инспектор/консоли, чтобы проверить, где ваши элементы в дереве 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

Спасибо Frode. Я попробую это сейчас – Quanda

+0

Хм, не работает. '$ documents' возвращается, когда я пытаюсь использовать этот метод. Вы уверены, что можете называть '.getElementsByTagName() 'в элементе div? Я бы подумал, что это сработает, но его не – Quanda

+0

Вы уверены, что '$ обычные' нашли узел? У меня была опечатка в идентификаторе контейнера, поэтому скопируйте его из источника, чтобы быть в безопасности. Или вы можете попробовать установить «$ условный» на один элемент таблицы или другой тип узла, который обертывает интересующие вас элементы td. Я тестировал его на случайном веб-сайте с контейнером-div в '$ common' и используя '$ normal.getElementsbyTagName (" a ")' для получения всех ссылок. –

Смежные вопросы