Подход сверху вниз или снизу вверх для поиска элементов в документе HTML DOM? - PullRequest
1 голос
/ 31 декабря 2010

Предполагается, что я использую рекурсивный цикл для упругого обнаружения и определения местоположения элементов DOM, которые будут работать с полуструктурированными и полуоднородными документами HTML DOM с веб-сайта.

Например, при сканировании ссылок на веб-сайте и при обнаружении небольших изменений его местоположения в xpath. Устойчивость необходима для обеспечения гибкого непрерывного сканирования.

1) Я знаю, что хочу ссылку, которая расположен в определенном регионе страница отличается от остальных (например, нижний колонтитул меню, заголовок и т. д.)

2) Это различимо, так как оказывается внутри стола и Парграф или контейнер.

3) Может быть приемлемый уровень неожиданных родителей или детей перед этой желаемой ссылкой, упомянутой в 1) но я не знаю что. Больше неожиданные элементы будут означать вылет из 1).

4) Идентификация с помощью идентификатора элемента и класс или любой другой уникальный атрибут значение не желательно.

Я думаю, что следующий xpath должен подвести итог:

/`/p/table/tr/td/a`

на некоторых страницах есть изменения в xpath, но они по-прежнему квалифицируются как 1) требуемая ссылка

//p/div/table/tr/td/a или //p/div/span/span/table/tr/td/b/a

Я использовал отступ для имитации каждой итерации цикла (

( я должен использовать плюральное или единственное число? Дети против ребенка. Родители против родителя. Я думаю, что единственное число имеет смысл, поскольку непосредственный родитель или ребенок здесь важны. )

Поиск сверху вниз :

how many p's are there ?
 how many these p's have table as child ? If none, search next sub level. 
   how many these table's have tr as child ? If none, search next sub level.
     how many these tr have td as child ? If none, search next sub level.
      how many these td have a as child ? 

ПОИСК ВНИЗ :

how many a's are there ?
 how many of these a's have td as parent ? If none, look up to the next super level.
  how many of these td have tr as parent ? If none, look up to the next super level.
   how many of these tr have table as parent ? If none, look up to the next super level.
    how many of these table have p as a parent ? If none, look up to the next super level.

Имеет ли значение, если это сверху вниз или снизу вверх? Я чувствую, что нисходящий поток бесполезен и неэффективен, если он поворачивается к концу цикла, нужная якорная ссылка не найдена.

Я думаю, что я бы также измерил, сколько неожиданных родителей или детей было обнаружено в каждой итерации цикла, и сравнил бы с заданной константой, с которой мне удобно работать, например, скажем, не более 2. Если есть 3 или более неожиданных итерации родителей или детей до обнаружения желаемой якорной ссылки, я бы предположил, что это не то, что я ищу.

Это правильный подход? Это просто то, что я придумал на макушке. Я прошу прощения, если эта проблема не ясна, я старался изо всех сил. Я хотел бы получить некоторую информацию об этом алгоритме.

1 Ответ

0 голосов
/ 31 декабря 2010

Кажется, что вы хотите что-то вроде :

//p//table//a

Если у вас есть ограничения на количество промежуточных элементов в пути, скажем, не более 2, тогдаПриведенное выше будет изменено на :

//p[not(ancestor::*[3])]
      //table[ancestor::*[1][self::p] or ancestor::*[2][self::p]]
               /tr/td//a[ancestor::*[1][self::td] or ancestor::*[2][self::td]]

. При этом будут выбраны все элементы a, чей родитель или прародитель td, чей родитель tr, чей родитель table, чьим родителем или дедушкой является p, который имеет менее 3 элементов-предков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...