2009-08-04 86 views
2

這不是一個真正的編程問題,更多的算法問題。查找HTML部分文檔的內容

問題:查找HTML頁面的「內容」部分。

「內容」指的是包含人類看到的頁面內容的dom,沒有噪音,只是「頁面實際內容」。 我知道問題沒有很好的定義,但讓我們繼續... 例如在博客網站中,這通常很容易,當瀏覽到特定的帖子時,您通常會在頁面的頂部有一些工具欄,也許有些導航元素在LHS上,然後你有包含內容的div。試圖從HTML中弄清楚這一點可能會很棘手。然而幸運的是,大多數博客都有RSS源,在這個特定帖子的Feed中,您會發現<說明>部分(或<內容:編碼>),這正是您想要的。 因此,爲了優化內容的定義,這是包含有趣部分的實際內容,刪除所有廣告,導航元素等。 因此,從博客中查找內容相對容易,假設他們擁有RSS。其他RSS支持網站也一樣。

新聞網站呢?在很多情況下,新聞網站都有RSS,但並非總是如此。如何在新聞網站上找到內容? 更一般的網站呢?許多網頁(當然不是全部)都有內容部分和其他部分。你能想出一個好的算法來找到那些「有趣」的部分,而不是那麼有趣?也許從那些不變的部分改變了?

希望我已經說清楚了......謝謝!

+0

對於網絡上的大多數網頁,您很好地發現任何「有趣的部分」 – 2009-08-04 09:12:17

+0

這是一個難以回答的問題。如果很容易從噪音中識別「有趣的內容」,那麼每個人都會使用「噪音」過濾器,就像Adblock用於阻止廣告一樣。 也就是說,通常,用戶看到的內容(基本上剝離了標記和腳本邏輯的html文件的全部內容)可能包含「信息」,並且可以使用htmlToText轉換器提取。來自www.htmlparser.org的StringBean類可以用來做到這一點(java)。 – hashable 2009-08-28 00:27:10

回答

2

我還沒有這樣做,但這將是我的一般方法。

正如你指出,在可見的內容部分的結構的缺乏(即它沒有標記,如headernavigationads)的HTML意味着它是很難的家在頁面的重要組成部分。我的方法是首先刪除你明確認爲不重要的獨特元素。排除的一種可能的列表可以是:

  • meta元素如!doctypehead(取title作爲單獨的數據片)
  • 動態元素如objectembedappletscript
  • 圖像(取決於是否要保留它們),img
  • 表單元素,即forminputtextarealabellegendselectoption

第二遍可以再啓動排除經常出現的divul ID /類名,並在他們的所有標籤,如:

  • headerfootermeta
  • navnavigationtopnavsidebar
  • adadsadu(通常用於廣告和其他名稱)

這將有望從頁面中移除裝飾的顯著量。下一個挑戰是嘗試從剩下的內容中確定主要內容,並且我建議最初假定網站作者正確使用語義HTML,所以主要使用h1,h2頭標記和段落標記。

爲了識別內容,我會尋找任何標題標籤,然後是段落標籤。 (對於您的主要內容,這可能是h2; h1標記經常(並且可以錯誤地)用於顯示網站名稱或徽標,但希望通過排除頁面的標題部分來刪除此標記。)每個後續段落都應該將其添加到當前內容中,直到達到中斷爲止,這可能是divtd元素的結尾,也可能是您開始的同一級別的標題元素。

由於您可能在頁面上收集了幾組內容(可能是主要內容以及作者的簡介),因此您需要測試並完善一個決策步驟,該步驟選擇最多可能的人選。這通常是最大的,無論在長度和使用的段落元素數量方面。當您收集更多內容示例時,您可以在算法中添加支持度量;這可能是你注意到許多頁面使用div id="content"id="maincontent"。保留您檢測到的輔助內容項也很有用,因此,如果某些網站具有構建內容的好奇方式,那麼一旦您將捕手添加到您的算法中,就可以針對此操作重新運行它網站的內容。

0

一個結構良好的網站將有相同的代碼重複使用相同的代碼,例如,導航,標題等。

如果您有要分析的目標頁面,請嘗試瀏覽相同域/子域下的其他幾個頁面,找到所有頁面通用的元素。那些是你想要擺脫的噪音。

然後你可以看看剩下的東西,看看是否有噪音溜進來。當你收集到合理數量的這些數據時,試着在它們中找到一些模式。優化你的邏輯並重復。