4

Я работаю над алгоритмом, который попытается выбрать, учитывая HTML-файл, то, что он считает, является родительским элементом, который, скорее всего, содержит большую часть текста содержимого страницы. Например, было бы выбрать Див «содержание» в следующем HTML:Скребковка самого большого блока текста из 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 документа в его листьях, добавляя вверх по длине текст и только видя, какой другой текст имеет родитель, если родитель дает нам больше контента, чем дети.

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

+0

Любая удача Макс? Я пытаюсь сделать то же самое. – 2010-12-19 18:17:52

+0

См. Мой ответ, который я только что добавил. – Max 2010-12-29 22:40:03

ответ

1

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

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

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

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

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

+0

Я бы использовал python/beautifulsoup. Мне нравится эта идея. Я попробую выполнить реализацию, где я отфильтровываю все небольшие теги форматирования, а затем обрабатываю текст. – Max 2008-11-14 17:12:44

1

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

+0

разве это не было «листвы» или я не ошибаюсь? – markus 2008-11-14 08:24:07

5

Вот примерно, как я бы подойти к этому:

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

0

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