Немного о глубоком анализе HTML

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

1. Уровень тэга (tag level)

Эта метрика определяет вложенность тэга в общем дереве и рассчитать его возможно двумя способами:

— пройдясь по всему дереву тэгов и назначив номер уровня каждому элементу

— рассчитав его обратившись к вышестоящим тэгам от данного.

Первый случай работает когда есть возможность сохранить уровень тэга в полученный парсером объект или же если после обработки HTML парсер создаёт для каждого из тэгов уникальный идентификатор (чего сейчас нет в принципе).

Зачем эта метрика нужна? Для того чтобы определить группы похожих элементов находящихся на одном уровне. Например, это позволяет выявить меню сайта и иные блоки ссылок. Например, практически все блоки SEO ссылок содержат одноуровневые элементы и даже если они разбиты на несколько подблоков по 3-4 ссылки в каждом, тем не менее уровень ссылок всегда тот же.

Другое применение это эта же метрика используется мною в Скиуре при выявлении повторяющихся новостных блоков.

Главный недостаток в том что на сегодняшний день не существует парсеров проставляющих её при обработке HTML, а последующая переработка создаваемых парсерами деревьев довольно ресурсоёмка.

2. Сдвиг тэга (tag shift)

Определяет  позицию тэга в списке потомков его родителя.  Фактически — это ответ на вопрос «сколько тэгов от такого-то надо отсчитать чтобы найти нужный».

Эта метрика используется при сравнении отдельных тэгов и их групп и для определения типовых последовательностей. В алгоритме  Скиура с помощью tag shift выявляются новости не выделенные в отдельные блоки, а публикуемые как чередующиеся последовательности тэгов


3. Путь сдвига (shift path)

Это  один из уникальных идентификаторов тэгов основанный на том что любой тэг можно уникально идентифицировать зная его родительский тэг и сдвиг тэга.  Shift path записывается как массив чисел сдвигов тэгов родителей искомого тэга по одному.

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

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

4. Глубина тэга (tag deepness)

Соответствует уровню наиболее глубокого потомка от данного тэга.  Эта метрика необходима при выявлении типовых шаблонов блоков тэгов, а также как одна из метрик оценки сходства тэгов.

5. Идентификаторы уникальности

В ряде случаях извлечения информации из HTML возникает необходимость совершать более одного прохода по DOM дереву для того чтобы эти проходы упростить и минимизировать необходима возможность уникальной идентификации тэгов в дереве что может быть сделано более чем одним способом:

  • прирастающее число — уникальность по номеру тэга
  • уникальность по пути сдвига
  • уникальность по прямому или обратному пути xpath
  • уникальность по атрибутам и значению тэга в форме xpath

На практике то чего более всего нехватает большинству известных мне парсеров — это наличие у тэга возможности получить его простой ID и получить этот тэг по ID из общего дерева.  Для этой задачи достаточно просто прирастающего числа.

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

6. Схожесть тэгов (tag similarity)

Это сравнение двух тэгов на предмет проверки того являются ли они схожими контейнерами, входят ли в один блок из нескольких тэгов или несут одну и ту же роль в соседствующих блоках.

Схожесть оценивается по совокупности параметров:

  • атрибуты тэга (class, style, align)
  • глубина тэга
  • сдвиг тэга
  • уровень тэга
  • число тэгов потомков
  • флаг наличия текста

Основная загвоздка при использовании всех этих метрик в том что оптимальной не существует парсеров которые бы хотя бы помогали при работе с ними, а то есть выдавали бы уникальные идентификаторы тэгов в DOM’дереве чтобы можно было построить параллельное дерево метрик или же позволяли бы добавлять произвольные значения тэгам не меняя при этом их атрибуты.

Собственно решением будет написание своего парсера или адаптация имеющегося. Например, для Python есть HTML5Lib  http://code.google.com/p/html5lib/ где есть возможность указывать свой класс построитель дерева куда все эти метрики и возможно поместить — это уже означает что задача упрощается вдвое.

В результате можно проводить анализ HTML страницы уже не как дерева объектов, а как таблицы или совокупности таблиц к которым можно обращаться с произвольными выборками хоть через SQL или SPARQL запросы, а также с большим числом метрик часть из которых я перечислил выше.


About This Author

Яндекс.Метрика