本方法是基于文本密度的方法,最初的想法來源于哈工大的《基于行塊分布函數的通用網頁正文抽取算法》,本文基于此進行一些小修改。
約定:
本文基于網頁的不同行來進行統計,因此,假設網頁內容是沒有經過壓縮的,就是網頁有正常的換行的。
有些新聞網頁,可能新聞的文本內容比較短,但其中嵌入一個視頻文件,因此,我會給予視頻較高的權重;這同樣適用于圖片,這里有一個不足,應該是要根據圖片顯示的大小來決定權重的,但本文的方法未能實現這一點。
由于廣告,導航這些非正文內容通常以超鏈接的方式出現,因此文本將給予超鏈接的文本權重為零。
這里假設正文的內容是連續的,中間不包含非正文的內容,因此實際上,提取正文內容,就是找出正文內容的開始和結束的位置。
步驟:
首先清除網頁中CSS,Javascript,注釋,Meta,Ins這些標簽里面的內容,清除空白行。
計算每一個行的經過處理的數值(1)
計算上面得出的每行文本數的最大正子串的開始結束位置
其中第二步需要說明一下:
對于每一行,我們需要計算一個數值,這個數值的計算如下:
一個圖片標簽img,相當于出現長度為50字符的文本 (給予的權重),x1,
一個視頻標簽embed,相當于出現長度為1000字符的文本, x2
一行內所有鏈接的標簽 a 的文本長度 x3 ,
其他標簽的文本長度 x4
每行的數值 = 50 * x1其出現次數 + 1000 * x2其出現次數 + x4 – 8
//說明, -8 因為我們要計算一個最大正子串,因此要減去一個正數,至于這個數應該多大,我想還是按經驗來吧。
完整代碼
代碼如下:
#coding:utf-8
import re
def remove_js_css (content):
""" remove the the javascript and the stylesheet and the comment content (<script>....</script> and <style>....</style> <!-- xxx -->) """
r = re.compile(r'''<script.*?</script>''',re.I|re.M|re.S)
s = r.sub ('',content)
新聞熱點
疑難解答