摘要:無關(guān)標簽的一般長文本網(wǎng)頁正文內(nèi)容抽取一般的網(wǎng)頁內(nèi)容抽取需要針對特定的網(wǎng)站進行特定的檢查定位正文標簽,指定抽取規(guī)則。
無關(guān)標簽的一般長文本網(wǎng)頁正文內(nèi)容抽取
一般的網(wǎng)頁內(nèi)容抽取需要針對特定的網(wǎng)站進行特定的檢查定位正文標簽,指定抽取規(guī)則。但是如果需要抽取100個不同內(nèi)容結(jié)構(gòu)的網(wǎng)站正文,需要的就是100個不同的規(guī)則。
有沒有一種通用的內(nèi)容抽取呢??梢灾换诰W(wǎng)頁正文內(nèi)容的變化而變化的規(guī)則f(x).
本文實現(xiàn)的是針對于一般的長文本正文類網(wǎng)站(博客、新聞、小說類)實現(xiàn)的通用正文內(nèi)容抽取。像那種需要抽取的正文內(nèi)容C長度與網(wǎng)頁內(nèi)容W長度比例C/W<0.5的可能會出現(xiàn)不適用的情況。(比如正文是一句話幾個字,整個頁面內(nèi)容的文字長度超過了正文的2倍,那最好使用DOM標簽規(guī)則抽取)
以下的“網(wǎng)頁”均指長文本類型的網(wǎng)頁為什么抽取正文
一般的網(wǎng)頁正文都是屬于段落類型的文本,所屬標簽不一,其他的無用信息(如網(wǎng)頁版權(quán)、站點通知、導航內(nèi)容等)也占據(jù)了一定的頁面內(nèi)容,如果單純的把網(wǎng)頁內(nèi)容文字全部抽取出來,
這很簡單,但是會夾雜很多的無用內(nèi)容,干擾太大,所以針對正文抽取得到頁面的真正有用信息是主要目的??梢岳谜膬?nèi)容進行網(wǎng)頁相似度的計算。
抽取正文要找到正文的分布特征,將爬取到的網(wǎng)頁去除所有標簽,得到每一行的內(nèi)容后,可以根據(jù)(行號,字符數(shù))制作圖表查看兩者的關(guān)聯(lián):
下圖是騰訊新聞一則新聞頁面的行號-行字數(shù)關(guān)系圖表:
下圖是CSDN的兩則博文正文行號-行字數(shù)關(guān)系圖表:
《中文編碼相關(guān),python處理gbk編碼的xml文件方法》:
《python抓取gb2312gbk編碼網(wǎng)頁亂碼問題》:
下圖是segmentfault的一篇博文正文行號-行字數(shù)關(guān)系圖表:
《解決 ScriptError的另類思路》:
可以看到,正文的內(nèi)容一般是連續(xù)行的塊,因此我們可以設(shè)置閾值來過濾一些非正文的干擾行,但是針對某些連續(xù)行并不是有效正文的情況,就需要看這個連續(xù)行組成的塊的總字符數(shù)。
如果字數(shù)少于一個閾值,就不屬于正文,也就是正文的字符密度,由此可見,正文可以基于連續(xù)行字符密度來進行提取。
假設(shè)我們已經(jīng)爬取了網(wǎng)頁內(nèi)容WebContent,并且將W的所有標簽去除得到了純文本保留行格式的文字內(nèi)容LinesContent.接下來:
#三個可控變量,自由調(diào)整使抽取達到理想效果 #連續(xù)行閾值:連續(xù)多少行則認為是一個正文內(nèi)容塊 threshold = 5 #正文內(nèi)空行閾值:允許正文內(nèi)容 段落或正文行 之間有多少空行 gap = 3 #正文字符密度閾值:每一行的字符數(shù)達到多少則認為屬于正文內(nèi)容 density = 45 #********初始化設(shè)置#******** #保留抽取結(jié)果字典,格式:{<連續(xù)塊字符總數(shù)>:<塊文字內(nèi)容>,...} results={} #已經(jīng)達到前后連續(xù)的次數(shù) comobo_num =0 #當前連續(xù)塊的總字符數(shù) combo_len = 0 #當前連續(xù)空行數(shù) combo_null=0 #當前連續(xù)塊的文字內(nèi)容 combo_text = "" #當前行/前一行的字符數(shù) pre_len = 0 for i in LinesContent: #當前行非空 if i.strip(): pre_len = len(i) comobo_num += 1 combo_null = 0 combo_len += pre_len #疊加非空行內(nèi)容到連續(xù)內(nèi)容中 combo_text = combo_text+i+ os.linesep #針對單行文本情況 if len(a)==1 and pre_len >= density*threshold: results[pre_len]=combo_text else: combo_null +=1 #如果前一行非空 if pre_len: #連續(xù)空行閾值判斷 if combo_null > gap: #連續(xù)塊判斷 if combo_len >= density*threshold and comobo_num >= threshold: results[combo_len]=combo_text else: continue #非正文連續(xù)塊則全部參數(shù)復(fù)位 comobo_num = 0 combo_len = 0 if combo_null > gap else combo_len pre_len = 0 combo_text = "" if combo_null > gap else combo_text
經(jīng)過對多個長文本類型網(wǎng)站的抓取抽取,正文抽取成功率達到了90%以上。
Todo針對有圖片嵌入的正文抽取
連帶正文標簽的抽取
正文格式的保存
源碼地址:GitHub
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42697.html
摘要:為了方便廣大的開發(fā)者,特此統(tǒng)計了網(wǎng)上諸多的免費,為您收集免費的接口服務(wù),做一個的搬運工,以后會每月定時更新新的接口。將長段中文切詞分開。 為了方便廣大的開發(fā)者,特此統(tǒng)計了網(wǎng)上諸多的免費API,為您收集免費的接口服務(wù),做一個api的搬運工,以后會每月定時更新新的接口。有些接口來自第三方,在第三方注冊就可以成為他們的會員,免費使用他們的部分接口。 百度AccessToken:針對HTTP ...
閱讀 3295·2021-11-25 09:43
閱讀 2097·2021-09-22 10:02
閱讀 3358·2021-09-06 15:00
閱讀 2308·2019-08-30 15:56
閱讀 2361·2019-08-30 15:54
閱讀 3238·2019-08-30 14:14
閱讀 2271·2019-08-29 17:25
閱讀 2914·2019-08-29 17:16