Зачистка самого большого блока текста из документа HTML - PullRequest
4 голосов
/ 14 ноября 2008

Я работаю над алгоритмом, который попытается определить, учитывая файл 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 до конца, добавление длины текста и просмотр только того, какой другой текст у родителя, если родитель дает нам больше контента, чем дети делаем.

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

Ответы [ 5 ]

9 голосов
/ 30 декабря 2010

Одно слово: Котельная труба

5 голосов
/ 14 ноября 2008

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

// 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), вы также можете утопить элементы во время сортировки (или после), в зависимости от того, насколько сложной должна быть эта вещь.

1 голос
/ 14 ноября 2008

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

1 голос
/ 14 ноября 2008

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

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

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

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

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

0 голосов
/ 03 мая 2011

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

...