4

我正在研究一種算法,它會嘗試挑選出給定HTML文件,它認爲是最有可能包含頁面內容文本大部分的父元素。 例如,它會選擇在以下HTML中的div「內容」:從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

我也可以說這個詞的銀行有很大的幫助。任何通用的'advertisey'單詞列表,如twitter和click以及幾個大寫的名詞連續。使用POS標記器可以提高準確性。對於新聞網站,世界上所有已知主要城市的名單可以幫助分開。事實上,甚至可以在不查看HTML的情況下幾乎刮掉頁面。