2010-07-24 46 views
2

大任務:我正在嘗試獲取網頁摘要的幾行內容。即我想有一個函數可以接收一個URL並返回該頁面中最具信息量的段落。 (這通常是實際內容文本的第一段,與導航欄等「垃圾文本」形成鮮明對比)。Python:檢測字符串中的實際文本段落

因此,我設法通過刪除標籤來將HTML頁面縮減爲一堆文本,扔出<HEAD>和所有腳本。但有些文字仍然是「垃圾文字」。我想知道文本的實際段落在哪裏開始。 (理想情況下,它應該與人類語言無關,但如果您只有英文解決方案,這可能也有幫助。)

如何確定哪些文本是「垃圾文本」,哪一個是實際內容?

更新:我看到一些人指出我使用HTML解析庫。我正在使用美麗的湯。我的問題是不解析HTML;我已經擺脫了所有的HTML標籤,我只是有一堆文本,我想分離文本和垃圾文本。

+1

你能後你有文本的樣本?你想要它成爲什麼?關於用正則表達式解析HTML - 強制性鏈接 - http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Oded 2010-07-24 16:18:13

+0

這是一個來自網頁:http://cool-rr.com/sample_text.delete_me.txt它恰好是來自Python文檔的頁面。 – 2010-07-24 16:41:16

+0

我刪除了'[regex]'標籤,因爲它似乎在欺騙人們認爲你想用正則表達式從頁面中提取文本,但這不是你的問題。這實際上是一個文本處理問題。它幾乎沒有任何與HTML有關的事情;從網頁中提取文本的事實並不重要,除非您希望嘗試使用HTML標記來幫助您識別重要的文本片段。 – 2010-07-24 18:39:18

回答

1

該問題的一般解決方案是要解決的不平凡問題。

爲了說明這一點,Google搜索的很大一部分成功源於他們能夠自動識別任意網頁的某些語義,即找出「內容」的位置。

想到的一個想法是,如果您可以從同一網站抓取很多網頁,那麼您將能夠識別模式。菜單標記在所有頁面上基本相同。如果你以某種方式將其歸零(並且需要相當「模糊」),剩下的就是內容。

下一步將確定文本和構成邊界的內容。理想情況下,這將是一些HTML段落,但你大部分時間都不會那麼幸運。

更好的方法可能是找到該站點的RSS源並以這種方式獲取內容,因爲該內容將按原樣被刪除。忽略任何AdSense(或類似)內容,您應該能夠獲取文本。

哦,絕對丟掉你的正則表達式代碼。這絕對不需要HTML解析器。

+1

Cletus,HTML是一個非問題。標籤不關心我,我把它們都扔掉了。 我正在考慮正則表達式的原因是用它來告訴哪些文本段落正在流動,哪些是來自導航欄的鏈接文本(或其他小段文本)。 – 2010-07-24 16:47:23

1

可能有些矯枉過正,但你可以試試nltk,自然語言工具包。該庫用於解析自然語言。這是一個不錯的圖書館和一個有趣的主題。如果您想剛剛從你會做類似文本得到的句子:

>>> import nltk 
>>> nltk.sent_tokenize("Hi this is a sentence. And isn't this a second one, a sentence with a url http://www.google.com in it?") 
['Hi this is a sentence.', "And isn't this a second one, a sentence with a url http://www.google.com in it?"] 

或者你可以使用從PunktSentenceTokenizersentences_from_text方法。在開始之前,您必須先做nltk.download()

0

我建議看看Readability做什麼。可讀性除去頁面的實際內容,並將其重新排列以方便閱讀。在從我的經驗中檢測內容方面,它似乎工作得很好。

看看它的source code(特別是grabArticle功能),也許你可以得到一些想法。