Вопрос

Я работаю над алгоритмом, который попытается определить, учитывая файл HTML, что он считает родительским элементом, который, скорее всего, содержит большую часть текста содержимого страницы. Например, он выберет div "content" в следующем HTML:

<html>
   <body>
      <div id="header">This is the header we don't care about</div>
      <div id="content">This is the <b>Main Page</b> content.  it is the
      longest block of text in this document and should be chosen as
      most likely being the important page content.</div>
   </body>
</html>

Я выдвинул несколько идей, таких как обход дерева документа HTML до конца, добавление длины текста и просмотр только того, какой другой текст есть у родителя, если родитель дает нам больше контента, чем дети сделать.

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

Это было полезно?

Решение

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

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

Как только вы найдете наиболее содержательный блок, перейдите обратно по дереву к его родителю, чтобы получить ответ.

Я думаю, что ваше решение основано на том, как вы проходите DOM и отслеживаете сканируемые узлы.

Какой язык вы используете? Любые другие детали для вашего проекта? Также могут использоваться инструменты для конкретного языка или пакета.

Другие советы

Одно слово: Boilerpipe

Вот примерно так я бы подошел:

// get array of all elements (body is used as parent here but you could use whatever)
var elms = document.body.getElementsByTagName('*');
var nodes = Array.prototype.slice.call( elms, 0 );

// get inline elements out of the way (incomplete list)
nodes = nodes.filter(function (elm) {
  return !/^(a|br?|hr|code|i(ns|mg)?|u|del|em|s(trong|pan))$/i.test( elm.nodeName );
});

// sort elements by most text first
nodes.sort(function(a,b){
  if (a.textContent.length == b.textContent.length) return 0;
  if (a.textContent.length > b.textContent.length)  return -1;
  return 1;
});

Используя функции предков, такие как a.compareDocumentPosition (b) , вы также можете поглощать элементы во время сортировки (или после), в зависимости от того, насколько сложной должна быть эта вещь.

Вам также нужно будет сформулировать уровень, на котором вы хотите выбрать узел. В вашем примере узел body содержит еще больший объем текста. Таким образом, вы должны сформулировать, что именно является «родительским элементом».

Я также могу сказать, что банки слов очень помогают. Любые списки распространенных «рекламных» слов, таких как «твиттер» и «клик», а также несколько существительных с большой буквы подряд. Наличие POS-тегера может повысить точность. Для новостных сайтов можно выделить список всех известных крупных городов мира. На самом деле, вы можете почти поцарапать страницу, даже не глядя на HTML.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top