本發(fā)明涉及計算機技術領域,尤其涉及一種網(wǎng)頁內(nèi)容重構方法和系統(tǒng)。
背景技術:
隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)頁數(shù)據(jù)采集和內(nèi)容重構成為一項熱門技術,可以廣泛用于搜索引擎、網(wǎng)站移動化、數(shù)據(jù)分析以及一些內(nèi)容聚合的移動互聯(lián)網(wǎng)應用。
而網(wǎng)頁的主要開發(fā)語言中,HTML和CSS屬于標記性語言,JavaScript屬于弱類型的直譯式腳本語言,這些類型的開發(fā)語言具有靈活和兼容性強的特點,但如果要解析它們,卻增加了開發(fā)的難度。
目前常用的網(wǎng)頁分析方法是將網(wǎng)頁源碼解析為DOM樹對象,通過對樹節(jié)點的分析和遍歷,來獲取主體內(nèi)容。然而,網(wǎng)頁源碼中除了網(wǎng)頁關鍵內(nèi)容外,還包括大量的樣式數(shù)據(jù)、網(wǎng)頁外鏈,以及頁面廣告,這些內(nèi)容穿插在DOM樹節(jié)點中,為網(wǎng)頁數(shù)據(jù)采集帶來了很大的困難。
技術實現(xiàn)要素:
本發(fā)明要解決的技術問題是現(xiàn)有網(wǎng)頁分析方法中網(wǎng)頁源碼中包含與主體內(nèi)容無關的節(jié)點,為網(wǎng)頁數(shù)據(jù)采集帶來了很大的困難。
根據(jù)本發(fā)明一方面,提出網(wǎng)頁內(nèi)容重構方法,包括:
獲取網(wǎng)頁源碼;
遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型;
解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對節(jié)點賦予唯一的序列;
對節(jié)點進行簡化處理,以形成新對象;
根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提??;
將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。
在一個實施例,遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型的步驟包括:
通過對網(wǎng)頁頁面進行流式分析,遍歷網(wǎng)頁節(jié)點;
對各個節(jié)點進行記錄,并建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型。
在一個實施例,解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對各節(jié)點賦予唯一的序列的步驟包括:
解析建立的DOM樹內(nèi)存結構模型,判斷各節(jié)點的信息元素是否屬于三元素;
若該節(jié)點的信息元素屬于三元素,則記錄該節(jié)點的信息元素;
若該節(jié)點的信息元素不屬于三元素,則刪除該節(jié)點;
對記錄信息元素的節(jié)點賦予唯一的序列;
其中,三元素包括純文字信息、圖片信息和超鏈接地址。
在一個實施例,對節(jié)點進行簡化處理,以形成新對象的步驟包括:
判斷記錄信息元素的各節(jié)點是否屬于四信息;
若該節(jié)點屬于四信息,則該節(jié)點為有效節(jié)點;
若該節(jié)點不屬于四信息,則該節(jié)點屬于無效節(jié)點;
抽取所有效節(jié)點,將有效節(jié)點保存在對象化序列中,并將有效節(jié)點的序列復制到相應的對象化序列中以形成新對象;
其中,四信息包括純文字、純圖片、帶超鏈接文字和帶超鏈接圖片。
在一個實施例,新對象的節(jié)點以JSON數(shù)據(jù)結構進行保存。
在一個實施例,根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取的步驟包括:
從簡化后的節(jié)點末端開始,依次選擇節(jié)點序列由長到短的順序為目標節(jié)點;
由目標節(jié)點向相應的父類節(jié)點逐級回溯;
分析相應的父類節(jié)點以及父類的其它子類節(jié)點的數(shù)據(jù),直到遇到卡閘或根節(jié)點為止;
以序列為依據(jù),按照從父類節(jié)點到子類節(jié)點的順序?qū)?jié)點的內(nèi)容進行提取,以提取所有的內(nèi)容塊及權重值。
在一個實施例,根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取的步驟還包括:
驗證父類節(jié)點中的子類是否包含卡閘,若父類節(jié)點中任一子類節(jié)點包含卡閘,則該父類節(jié)點不能用于擴展,并記錄卡閘的位置。
在一個實施例,根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取的步驟之后:
對所提取的所有內(nèi)容塊的內(nèi)容權重進行比較;
若內(nèi)容塊中文字量超過閾值,則該內(nèi)容塊為頁面的主要內(nèi)容;
若內(nèi)容塊中圖片量超過閾值,則該內(nèi)容塊為頁面的主要內(nèi)容。
根據(jù)本發(fā)明的另一方面,還提出一種網(wǎng)頁內(nèi)容重構系統(tǒng),包括:
源碼獲取單元,用于獲取網(wǎng)頁源碼;
建模單元,用于遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型;
記錄單元,用于解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對節(jié)點賦予唯一的序列;
對象化單元,用于對節(jié)點進行簡化處理,以形成新對象;
提取單元,用于根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提?。?/p>
重構單元,用于將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。
在一個實施例,建模單元用于通過對網(wǎng)頁頁面進行流式分析,遍歷網(wǎng)頁節(jié)點,對各個節(jié)點進行記錄,并建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型。
在一個實施例,記錄單元用于解析建立的DOM樹內(nèi)存結構模型,判斷各節(jié)點的信息元素是否屬于三元素,若該節(jié)點的信息元素屬于三 元素,則記錄該節(jié)點的信息元素,若該節(jié)點的信息元素不屬于三元素,則刪除對節(jié)點,對記錄信息元素的節(jié)點賦予唯一的序列;
其中,三元素包括純文字信息、圖片信息和超鏈接地址。
在一個實施例,對象化單元用于判斷記錄信息元素的各節(jié)點是否屬于四信息,若該節(jié)點屬于四信息,則該節(jié)點為有效節(jié)點,若該節(jié)點不屬于四信息,則該節(jié)點屬于無效節(jié)點,抽取所有效節(jié)點,將有效節(jié)點保存在對象化序列中,并將有效節(jié)點的序列復制到相應的對象化序列中以形成新對象;
其中,四信息包括純文字、純圖片、帶超鏈接文字和帶超鏈接圖片。
在一個實施例,保存單元,用于將新對象的節(jié)點以JSON數(shù)據(jù)結構進行保存。
在一個實施例,對象化單元用于從簡化后的節(jié)點末端開始,依次選擇節(jié)點序列由長到短的順序為目標節(jié)點,由目標節(jié)點向相應的父類節(jié)點逐級回溯,分析相應的父類節(jié)點以及父類的其它子類節(jié)點的數(shù)據(jù),直到遇到卡閘或根節(jié)點為止,以序列為依據(jù),按照從父類節(jié)點到子類節(jié)點的順序?qū)?jié)點的內(nèi)容進行提取,以提取所有的內(nèi)容塊及權重值。
在一個實施例,對象化單元還用于驗證父類節(jié)點中的子類是否包含卡閘,若父類節(jié)點中任一子類節(jié)點包含卡閘,則該父類節(jié)點不能用于擴展,并記錄卡閘的位置。
在一個實施例,對象化單元還用于對所提取的所有內(nèi)容塊的內(nèi)容權重進行比較,若內(nèi)容塊中文字量超過閾值,則該內(nèi)容塊為頁面的主要內(nèi)容,若內(nèi)容塊中圖片量超過閾值,則該內(nèi)容塊為頁面的主要內(nèi)容。
與現(xiàn)有技術相比,本發(fā)明獲取網(wǎng)頁源碼,遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型,解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對節(jié)點賦予唯一的序列,對節(jié)點進行簡化處理,以形成新對象,根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取,將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。由于篩除了樣式、廣告、外鏈等與主體內(nèi)容無關的節(jié)點, 對網(wǎng)頁結構進行了簡化,能夠迅速定位到重要信息,減少對頁面內(nèi)容的大范圍遍歷,有利于網(wǎng)頁數(shù)據(jù)的采集。
進一步,由于本發(fā)明將JSON數(shù)據(jù)結構應用于網(wǎng)頁內(nèi)容重構,使得重構效率更高,更加靈活。
通過以下參照附圖對本發(fā)明的示例性實施例的詳細描述,本發(fā)明的其它特征及其優(yōu)點將會變得清楚。
附圖說明
構成說明書的一部分的附圖描述了本發(fā)明的實施例,并且連同說明書一起用于解釋本發(fā)明的原理。
參照附圖,根據(jù)下面的詳細描述,可以更加清楚地理解本發(fā)明,其中:
圖1為本發(fā)明網(wǎng)頁內(nèi)容重構方法的一個實施例的流程示意圖。
圖2為本發(fā)明網(wǎng)頁內(nèi)容重構方法的一個具體實施例的流程示意圖
圖3為本發(fā)明節(jié)點簡化前的示意圖。
圖4為本發(fā)明節(jié)點簡化后的示意圖。
圖5為本發(fā)明簡化后的網(wǎng)頁結構示意圖。
圖6為本發(fā)明經(jīng)過簡化后的網(wǎng)頁結構。
圖7為本發(fā)明網(wǎng)頁內(nèi)容重構的總體描述結構示意圖。
圖8為本發(fā)明網(wǎng)頁內(nèi)容重構系統(tǒng)的一個實施例的結構示意圖。
具體實施方式
現(xiàn)在將參照附圖來詳細描述本發(fā)明的各種示例性實施例。應注意到:除非另外具體說明,否則在這些實施例中闡述的部件和步驟的相對布置、數(shù)字表達式和數(shù)值不限制本發(fā)明的范圍。
同時,應當明白,為了便于描述,附圖中所示出的各個部分的尺寸并不是按照實際的比例關系繪制的。
以下對至少一個示例性實施例的描述實際上僅僅是說明性的,決不作為對本發(fā)明及其應用或使用的任何限制。
對于相關領域普通技術人員已知的技術、方法和設備可能不作詳細討論,但在適當情況下,所述技術、方法和設備應當被視為授權說明書的一部分。
在這里示出和討論的所有示例中,任何具體值應被解釋為僅僅是示例性的,而不是作為限制。因此,示例性實施例的其它示例可以具有不同的值。
應注意到:相似的標號和字母在下面的附圖中表示類似項,因此,一旦某一項在一個附圖中被定義,則在隨后的附圖中不需要對其進行進一步討論。
為使本發(fā)明的目的、技術方案和優(yōu)點更加清楚明白,以下結合具體實施例,并參照附圖,對本發(fā)明進一步詳細說明。
圖1為本發(fā)明網(wǎng)頁內(nèi)容重構方法的一個實施例的流程示意圖。該方法包括以下步驟:
在步驟110,獲取網(wǎng)頁源碼。
其中,由終端APP層或服務器層到指定網(wǎng)頁頁面地址獲取源代碼,該源代碼為有效的HTML標準語言體系。
在步驟120,遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型。
通過對網(wǎng)頁頁面進行流式分析,遍歷網(wǎng)頁節(jié)點,對各個節(jié)點進行記錄,并建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型。其中,本領域技術人員了解如何對網(wǎng)頁頁面進行流式分析,因此這里不展開描述。
在步驟130,解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對節(jié)點賦予唯一的序列。
本發(fā)明提出了幾個概念,例如,對頁面上真正有意義的,能夠作為區(qū)分點的只有三種基本元素,分別是:純文字信息、圖片信息、超鏈接地址,因此,定義三元素為純文字信息、圖片信息、超鏈接地址。該三元素主要用于頁面源碼建模時的屬性記錄字段。
本發(fā)明中,判斷各節(jié)點的信息元素是否屬于三元素,若該節(jié)點的信息元素屬于三元素,則記錄該節(jié)點的信息元素,若該節(jié)點的信息元 素不屬于三元素,則刪除該節(jié)點,并對記錄信息元素的節(jié)點賦予唯一的序列。
其中,序列可以命名為基因序列。基因序列是一種一維的數(shù)字序列號,在生成頁面節(jié)點建模時,將各個節(jié)點的基因序列記錄下來。同時定義了基因?qū)蛹?,每個節(jié)點都帶有它自己的基因信息,可以代表該節(jié)點與父類節(jié)點的層級關系。如一級節(jié)點就有單階基因值,二級節(jié)點就有二階基因值,同理N級為N階。
在步驟140,對節(jié)點進行簡化處理,以形成新對象。
在三元素中可單獨出現(xiàn)的有純文字和圖片;但不會單獨出現(xiàn)超鏈接地址,超鏈接地址可以和文字及圖片進行搭配;所以就衍生出四種信息類,分別是:純文字、純圖片、帶超鏈接文字、帶超鏈接圖片。所有網(wǎng)站的信息類內(nèi)容都是由這四種基本類型組合成。因此,本發(fā)明通過四信息來對有效節(jié)點進行判斷,并篩選掉無效節(jié)點。
例如,判斷記錄信息元素的各節(jié)點是否屬于四信息;若該節(jié)點屬于四信息,則該節(jié)點為有效節(jié)點;若該節(jié)點不屬于四信息,則該節(jié)點屬于無效節(jié)點;抽取所有效節(jié)點,將有效節(jié)點保存在對象化序列中,并將有效節(jié)點的序列復制到相應的對象化序列中以形成新對象。生成的新對象便于信息記錄、數(shù)據(jù)判斷以及結構調(diào)整排布等。
由于有對節(jié)點進行過濾(如去掉無信息類的節(jié)點)等過程,所以對象化序列中的新對象次序和頁面節(jié)點次序會呈現(xiàn)出結構不一樣的情況。因此,此時的新對象的節(jié)點順序有別于建模時的節(jié)點順序。
另外,本發(fā)明生成的新對象的節(jié)點以JSON數(shù)據(jù)結構進行保存。JSON數(shù)據(jù)結構雖然破壞了原DOM樹的父子節(jié)點關系,但JSON對象結構更便于全文檔的檢索和內(nèi)容提取。
在步驟150,根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取。
由于是在頁面解析建模時就已經(jīng)將節(jié)點基因生成好,所以基因序列不會受到后面的對象化的影響,基因里面的信息代表了原生頁面的組合規(guī)律。不管經(jīng)過對象化(簡化)后的次序如何的改變,只要通過排序出各個對象化中原節(jié)點的基因排列,是可以還原出原來的頁面節(jié) 點次序。本發(fā)明將基因序列里面的信息定義為基因特征。
在該步驟中,從簡化后的節(jié)點末端開始,依次選擇節(jié)點序列由長到短的順序為目標節(jié)點。由于節(jié)點末端都是三元素,因此從末端節(jié)點開始選擇,根據(jù)文字部分進行判斷,所以選擇的對象是帶有文字的節(jié)點,并且選擇有先后順序,例如,先從基因序列長度最長的節(jié)點作為目標節(jié)點。
由目標節(jié)點向相應的父類節(jié)點逐級回溯。其中,由選擇好的節(jié)點逐步往父類進行關聯(lián),并且分析關聯(lián)父類的數(shù)據(jù),比如有無包含有效的三元素。
然后,分析相應的父類節(jié)點以及父類的其它子類節(jié)點的數(shù)據(jù),直到遇到卡閘或根節(jié)點為止。此步驟為父類的逆向驗證。目的是為了驗證該父類中的子類是否含有卡閘,只要該父類中其中一個子類屬于卡閘,則表示該父類不能用于這一次的擴展。
其中,卡閘也稱為內(nèi)容斷層,可理解為過濾條件,通常是某些連續(xù)帶超鏈接的列表類;文章或者主題內(nèi)容遇到這種列表都會被中斷。例如,通常在一個信息網(wǎng)頁中,會提取到很多文字段和圖片,只有其中某一部分的文字和圖片才是該頁面的主體內(nèi)容;其它的都是非主體內(nèi)容,如廣告描述、友情鏈接、廣告圖片等。因此,需要通過一些方法加以區(qū)分辨別,這里利用“卡閘”的方式加以區(qū)分?!翱ㄩl”從字面上理解是關卡、閘門的意思,在源頁面內(nèi)容中,也就是通過多個卡閘將內(nèi)容段切斷并加以區(qū)分開來??ㄩl通常是連續(xù)帶有多個超鏈接或者導航性質(zhì)等的列表項,為了增加判斷的維度,也可以考慮設置方式,比如設置某些過濾用的關鍵字等,一旦文字中出現(xiàn)這些關鍵字則視作卡閘。
在父類的逆向驗證中,需要一個緩沖區(qū)對卡閘的位置進行記錄,防止別的末端子節(jié)點在提取時,還要對相同的卡閘做判斷,以提高整個過程的效率。
由一個目標節(jié)點可以提取頁面中一塊完整的內(nèi)容及其權重值,遍歷所有目標節(jié)點,可以獲取所有的內(nèi)容塊及權重值。
完成對所有末端節(jié)點的提取后,對所提取的節(jié)點進行內(nèi)容權重的比較。比較結果有以下幾種:
1)遍歷所有的內(nèi)容塊,并對文字信息量的多少進行比較,文字量較多的內(nèi)容則可定為該頁面的主要內(nèi)容。
2)若每個內(nèi)容塊的文字描述比較少甚至都是圖片,而某些內(nèi)容塊圖片數(shù)量較多,則以圖片最多的內(nèi)容塊作為主要內(nèi)容。
3)若沒有內(nèi)容塊,這情況也普遍存在,那就說明頁面上可能全是列表、導航或者無法解析的控件和腳本等;如JavaScript,AdobeFlash等,該頁面可判斷為無主要內(nèi)容。
4)若內(nèi)容塊很少,通常就1-3個,而且每個內(nèi)容塊就一張圖片,或者是簡簡單單的幾個字等;有可能該頁面就是只有頁面頭的圖片和頁面尾的一些版權介紹,其他都是導航和列表等。該情況下可取得內(nèi)容,但由于頁面無重點,因此內(nèi)容會意義不大??赏ㄟ^以下方法進行有效過濾:A)增加過濾擴展,如添加過篩選的濾字眼。B)調(diào)整父類層級提取底線等級進行限制,通常該內(nèi)容都處于很底層的父類節(jié)點中,將底線等級提高可有效過濾。
在步驟160,將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。
例如,將不同源網(wǎng)站的內(nèi)容進行重新組合,生成內(nèi)容塊之間的層級和位置關系并關聯(lián)新的樣式表,將內(nèi)容塊和樣式表進行關聯(lián),生成目標網(wǎng)頁或移動App內(nèi)容框架,為保證目標網(wǎng)站或移動App的內(nèi)容的同步更新,在內(nèi)容框架中,具體內(nèi)容實時向源網(wǎng)站獲取。
在本發(fā)明的實施例中,獲取網(wǎng)頁源碼,遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型,解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對節(jié)點賦予唯一的序列,對節(jié)點進行簡化處理,以形成新對象,根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取,將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。由于篩除了樣式、廣告、外鏈等與主體內(nèi)容無關的節(jié)點,對網(wǎng)頁結構進行了簡化,能夠迅速定位到重要信息,減少對頁面內(nèi)容 的大范圍遍歷,有利于網(wǎng)頁數(shù)據(jù)的采集。
進一步,由于本發(fā)明創(chuàng)造性地用JSON對象來記錄具有嵌套關系的網(wǎng)頁節(jié)點,此數(shù)據(jù)結構打破了DOM樹的數(shù)據(jù)結構,為后續(xù)進行內(nèi)容塊搜索提供了更加加速和靈活的方式。
另外,在主體內(nèi)容提取過程中,采用了從葉子節(jié)點開始回溯的算法,從基因值最長的節(jié)點開始提取主體內(nèi)容,更容易準確定位到主體內(nèi)容。
下面以一個具體實施例對本發(fā)明進行介紹,如圖2所示:
在步驟201,獲取網(wǎng)頁源碼。
網(wǎng)頁的源文件如下所示:
在步驟202,遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型。
通過HTML的規(guī)則方式進行逐層解析,基本包括了標簽,標簽屬性,及標簽下的內(nèi)容。標簽及標簽下的內(nèi)容視為節(jié)點,而標簽內(nèi)的屬性,則視為節(jié)點中的信息。如上面源碼中的<div>、<a>、<img>視為一個單獨的節(jié)點。
文字“參與人數(shù)”沒有標簽,是屬于純文本,不過也視為一個節(jié)點,由于純文本在<a>標簽內(nèi)部,可以看做是在<a>節(jié)點里面的子節(jié)點。
在步驟203,解析建立的DOM樹內(nèi)存結構模型,判斷各節(jié)點的信息元素是否屬于三元素。若是,則執(zhí)行步驟204,否則,執(zhí)行步驟 205。
在步驟204,記錄該節(jié)點的信息元素,然后執(zhí)行步驟206。
對于href、src是屬于前面提到的三元素,所以要相應的作為節(jié)點中的信息,記錄在每個節(jié)點內(nèi)。
在步驟205,刪除該節(jié)點。以后不再執(zhí)行本實施例的其它步驟。
對于alt、class等屬性并不屬于三元素的范疇,所以不必考慮,作為噪音信息篩除。
在步驟206,對記錄信息元素的節(jié)點賦予唯一的基因序列。
基因序列的記錄就是將屬于自己的所有父節(jié)點的數(shù)列記錄了下來,并生成自己的基因序列,該序列可以是有序數(shù)值,也可以是隨機數(shù)值,但要確保唯一性。
這樣就可以將整個頁面節(jié)點化,形成節(jié)點網(wǎng),這個節(jié)點網(wǎng)結構和頁面源碼結構相對應,當然也包括無必要或無意義的節(jié)點。因此,還必須對節(jié)點進行簡化處理,如步驟207-209。
其中,簡化前的示意圖如圖3所示,簡化后的示意圖如圖4所示。
在步驟207,過濾無效層。將類似Div、Table、ul、ol、span、font等只是針對三元素進行修飾的、而對三元素內(nèi)容無影響的標簽進行過濾;而且過濾要考慮到同層性質(zhì)的過濾,比如某層還嵌有多余的層,且該層已經(jīng)有基本的三元素,則該層不能過濾掉。
在步驟208,根據(jù)內(nèi)容層級進行重新布局。即將無效層過濾之后的層級調(diào)整。還可以執(zhí)行節(jié)點數(shù)據(jù)及擴展數(shù)據(jù)的封裝等。除了text、href、src等基本元素外,還封裝了hasChild、CtrlId、SymContent等擴展元素以用于后續(xù)的業(yè)務處理。
從圖4中可以看出,簡化前的節(jié)點html、body、div屬于無效層,因此被篩選掉了,此時只剩余兩個節(jié)點。
在步驟209,簡化后的數(shù)據(jù)結構以JSON對象保存。用JSON對象來記錄具有嵌套關系的網(wǎng)頁節(jié)點,此數(shù)據(jù)結構打破了DOM樹的數(shù)據(jù)結構,為后續(xù)進行內(nèi)容塊搜索提供了更加加速和靈活的方式。
簡化后的節(jié)點數(shù)據(jù)結構如圖5所示。
其中,簡化后對象的次序和原頁面并不對應,只是為了方便數(shù)據(jù)操作及查詢之用,也可以用作專門的腳本輸出,供第三方使用。
從簡化后的節(jié)點數(shù)據(jù)結構看出,有text、src這兩個字段屬性,分別用于記錄文字和圖片這兩個元素信息。而其它的如hasChild、CtrlId、SymContent等均屬于擴展信息,視具體實際需要進行擴展。
另外,從表中可以看到有inherit的字段,從字面上理解是就是繼承因子,里面記錄的就是之前說到的一維基因序列。該序列是每個節(jié)點都有,只是長度不一樣。例如,text字段的基因序列有五個數(shù)值,最后那個就是該節(jié)點的基因值,前面那四個記錄了父輩的基因信息。從基因序列的結構可以看出,雖然對象化后的結構發(fā)生了改變,但從基因序列還是可以回溯到原來的父親節(jié)點。
在步驟210,選擇有效葉子節(jié)點。圖6為經(jīng)過簡化后的網(wǎng)頁結構。以此圖為例,從末端節(jié)點開始,判斷的依據(jù)是基因值最長的文字優(yōu)先。從圖例可以看到,“文字+地址(ABGLM)”節(jié)點符合要求,作為判斷的第一個葉子節(jié)點,并標識為有效。
在步驟211,提取父類同層級節(jié)點。
在步驟212,父類節(jié)點的逆向回溯。由當前節(jié)點向父類逐級回溯,分析關聯(lián)父類以及父類的其他子類的數(shù)據(jù),直到遇到卡匣或根節(jié)點。在上圖中,由節(jié)點“ABGLM”開始回溯,可找到有效節(jié)點ABEI、ABEH、ABFK、ABFJ以及ABGL,遇到節(jié)點3(AC),此回溯停止。
在步驟213,判斷是否存在卡閘,若存在,則執(zhí)行步驟210,否則執(zhí)行步驟214。
在步驟214,以基因序列為依據(jù),提取網(wǎng)頁內(nèi)容。按照從父節(jié)點到子節(jié)點,從前到后到順序?qū)?nèi)容進行提取。以圖5為例,組合后的內(nèi)容順序為ABEI+ABEH+ABFK+ABFJ+ABGL+ABGLM,此提取的數(shù)據(jù)可認為是網(wǎng)頁的一個內(nèi)容塊。
在步驟215,判斷是否提取剩余未提取的末端節(jié)點。若提取,則執(zhí)行步驟210,否則執(zhí)行步驟216。
在步驟216,對所提取的所有內(nèi)容塊的內(nèi)容權重進行比較。
在步驟217,將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。
本發(fā)明網(wǎng)頁內(nèi)容重構的總體描述可以如圖7所示:
(1)為網(wǎng)站源碼。
(2)為通過去噪簡化后的網(wǎng)頁結構,其中網(wǎng)頁結構可以采用JSON對象存儲。
(3)為提取的一個內(nèi)容塊。
(4)為多個源網(wǎng)頁以及人工參與配置后組裝的內(nèi)容塊。
(5)為通過樣式關聯(lián)生成的目標網(wǎng)頁或移動APP。
為保證目標網(wǎng)站或移動App的內(nèi)容的同步更新,在內(nèi)容框架中,具體內(nèi)容實時向源網(wǎng)站獲取。
在該實施例中,將網(wǎng)頁中無效層級關系以及樣式、廣告、外鏈等“噪音”信息進行篩除。簡化了網(wǎng)頁結構,加快了后續(xù)內(nèi)容提取。以JSON對象來記錄具有嵌套關系的網(wǎng)頁節(jié)點,此數(shù)據(jù)結構打破了DOM樹的數(shù)據(jù)結構,為后續(xù)進行內(nèi)容塊搜索提供了更加加速和靈活的方式。另外,采用了從葉子節(jié)點開始回溯的算法,從基因值最長的節(jié)點開始提取主體內(nèi)容,更容易準確定位到主體內(nèi)容。將不同來源的內(nèi)容塊進行重組,有利于網(wǎng)頁數(shù)據(jù)的采集。
圖8為本發(fā)明網(wǎng)頁內(nèi)容重構系統(tǒng)的一個實施例的結構示意圖。該系統(tǒng)包括:源碼獲取單元810、建模單元820、記錄單元830、對象化單元840、提取單元850和重構單元860。其中:
源碼獲取單元810,用于獲取網(wǎng)頁源碼。
其中,由終端APP層或服務器層到指定網(wǎng)頁頁面地址獲取源代碼,該源代碼為有效的HTML標準語言體系。
建模單元820,用于遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型。
建模單元820通過對網(wǎng)頁頁面進行流式分析,遍歷網(wǎng)頁節(jié)點,對各個節(jié)點進行記錄,并建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型。其中,本領域技術人員了解如何對網(wǎng)頁頁面進行流式分析,因此這里 不展開描述。
記錄單元830,用于解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對節(jié)點賦予唯一的序列。
本發(fā)明提出了幾個概念,例如,對頁面上真正有意義的,能夠作為區(qū)分點的只有三種基本元素,分別是:純文字信息、圖片信息、超鏈接地址,因此,定義三元素為純文字信息、圖片信息、超鏈接地址。該三元素主要用于頁面源碼建模時的屬性記錄字段。
本發(fā)明中,記錄單元830判斷各節(jié)點的信息元素是否屬于三元素,若該節(jié)點的信息元素屬于三元素,則記錄該節(jié)點的信息元素,若該節(jié)點的信息元素不屬于三元素,則刪除該節(jié)點,并對記錄信息元素的節(jié)點賦予唯一的序列。
其中,序列可以命名為基因序列?;蛐蛄惺且环N一維的數(shù)字序列號,在生成頁面節(jié)點建模時,將各個節(jié)點的基因序列記錄下來。同時定義了基因?qū)蛹墸總€節(jié)點都帶有它自己的基因信息,可以代表該節(jié)點與父類節(jié)點的層級關系。如一級節(jié)點就有單階基因值,二級節(jié)點就有二階基因值,同理N級為N階。
對象化單元840,用于對節(jié)點進行簡化處理,以形成新對象。
在三元素中可單獨出現(xiàn)的有純文字和圖片;但不會單獨出現(xiàn)超鏈接地址,超鏈接地址可以和文字及圖片進行搭配;所以就衍生出四種信息類,分別是:純文字、純圖片、帶超鏈接文字、帶超鏈接圖片。所有網(wǎng)站的信息類內(nèi)容都是由這四種基本類型組合成。因此,本發(fā)明通過四信息來對有效節(jié)點進行判斷,并篩選掉無效節(jié)點。
例如,對象化單元840判斷記錄信息元素的各節(jié)點是否屬于四信息;若該節(jié)點屬于四信息,則該節(jié)點為有效節(jié)點;若該節(jié)點不屬于四信息,則該節(jié)點屬于無效節(jié)點;抽取所有效節(jié)點,將有效節(jié)點保存在對象化序列中,并將有效節(jié)點的序列復制到相應的對象化序列中以形成新對象。生成的新對象便于信息記錄、數(shù)據(jù)判斷以及結構調(diào)整排布等。
由于有對節(jié)點進行過濾(如去掉無信息類的節(jié)點)等過程,所以 對象化序列中的新對象次序和頁面節(jié)點次序會呈現(xiàn)出結構不一樣的情況。因此,此時的新對象的節(jié)點順序有別于建模時的節(jié)點順序。
另外,本發(fā)明還包括保存單元,用于將生成的新對象的節(jié)點以JSON數(shù)據(jù)結構進行保存,該保存單元未標識在附圖中。JSON數(shù)據(jù)結構雖然破壞了原DOM樹的父子節(jié)點關系,但JSON對象結構更便于全文檔的檢索和內(nèi)容提取。
提取單元850,用于根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取。
由于是在頁面解析建模時就已經(jīng)將節(jié)點基因生成好,所以基因序列不會受到后面的對象化的影響,基因里面的信息代表了原生頁面的組合規(guī)律。不管經(jīng)過對象化(簡化)后的次序如何的改變,只要通過排序出各個對象化中原節(jié)點的基因排列,是可以還原出原來的頁面節(jié)點次序。本發(fā)明將基因序列里面的信息定義為基因特征。
提取單元850從簡化后的節(jié)點末端開始,依次選擇節(jié)點序列由長到短的順序為目標節(jié)點。由于節(jié)點末端都是三元素,因此從末端節(jié)點開始選擇,根據(jù)文字部分進行判斷,所以選擇的對象是帶有文字的節(jié)點,并且選擇有先后順序,例如,先從基因序列長度最長的節(jié)點作為目標節(jié)點。
由目標節(jié)點向相應的父類節(jié)點逐級回溯。其中,由選擇好的節(jié)點逐步往父類進行關聯(lián),并且分析關聯(lián)父類的數(shù)據(jù),比如有無包含有效的三元素。
然后,分析相應的父類節(jié)點以及父類的其它子類節(jié)點的數(shù)據(jù),直到遇到卡閘或根節(jié)點為止。此步驟為父類的逆向驗證。目的是為了驗證該父類中的子類是否含有卡閘,只要該父類中其中一個子類屬于卡閘,則表示該父類不能用于這一次的擴展。
其中,卡閘也稱為內(nèi)容斷層,可理解為過濾條件,通常是某些連續(xù)帶超鏈接的列表類;文章或者主題內(nèi)容遇到這種列表都會被中斷。例如,通常在一個信息網(wǎng)頁中,會提取到很多文字段和圖片,只有其中某一部分的文字和圖片才是該頁面的主體內(nèi)容;其它的都是非主體內(nèi)容,如廣告描述、友情鏈接、廣告圖片等。因此,需要通過一些方 法加以區(qū)分辨別,這里利用“卡閘”的方式加以區(qū)分?!翱ㄩl”從字面上理解是關卡、閘門的意思,在源頁面內(nèi)容中,也就是通過多個卡閘將內(nèi)容段切斷并加以區(qū)分開來。卡閘通常是連續(xù)帶有多個超鏈接或者導航性質(zhì)等的列表項,為了增加判斷的維度,也可以考慮設置方式,比如設置某些過濾用的關鍵字等,一旦文字中出現(xiàn)這些關鍵字則視作卡閘。
在父類的逆向驗證中,需要一個緩沖區(qū)對卡閘的位置進行記錄,防止別的末端子節(jié)點在提取時,還要對相同的卡閘做判斷,以提高整個過程的效率。
由一個目標節(jié)點可以提取頁面中一塊完整的內(nèi)容及其權重值,遍歷所有目標節(jié)點,可以獲取所有的內(nèi)容塊及權重值。
完成對所有末端節(jié)點的提取后,對所提取的節(jié)點進行內(nèi)容權重的比較。比較結果有以下幾種:
1)遍歷所有的內(nèi)容塊,并對文字信息量的多少進行比較,文字量較多的內(nèi)容則可定為該頁面的主要內(nèi)容。
2)若每個內(nèi)容塊的文字描述比較少甚至都是圖片,而某些內(nèi)容塊圖片數(shù)量較多,則以圖片最多的內(nèi)容塊作為主要內(nèi)容。
3)若沒有內(nèi)容塊,這情況也普遍存在,那就說明頁面上可能全是列表、導航或者無法解析的控件和腳本等;如JavaScript,AdobeFlash等,該頁面可判斷為無主要內(nèi)容。
4)若內(nèi)容塊很少,通常就1-3個,而且每個內(nèi)容塊就一張圖片,或者是簡簡單單的幾個字等;有可能該頁面就是只有頁面頭的圖片和頁面尾的一些版權介紹,其他都是導航和列表等。該情況下可取得內(nèi)容,但由于頁面無重點,因此內(nèi)容會意義不大。可通過以下方法進行有效過濾:A)增加過濾擴展,如添加過篩選的濾字眼。B)調(diào)整父類層級提取底線等級進行限制,通常該內(nèi)容都處于很底層的父類節(jié)點中,將底線等級提高可有效過濾。
重構單元860,用于將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。
例如,將不同源網(wǎng)站的內(nèi)容進行重新組合,生成內(nèi)容塊之間的層級和位置關系并關聯(lián)新的樣式表,將內(nèi)容塊和樣式表進行關聯(lián),生成目標網(wǎng)頁或移動App內(nèi)容框架,為保證目標網(wǎng)站或移動App的內(nèi)容的同步更新,在內(nèi)容框架中,具體內(nèi)容實時向源網(wǎng)站獲取。
在本發(fā)明的實施例中,獲取網(wǎng)頁源碼,遍歷網(wǎng)頁節(jié)點,以建立與網(wǎng)頁結構一致的DOM樹內(nèi)存結構模型,解析建立的DOM樹內(nèi)存結構模型,記錄節(jié)點的信息元素,并對節(jié)點賦予唯一的序列,對節(jié)點進行簡化處理,以形成新對象,根據(jù)序列對新對象的節(jié)點及其內(nèi)容進行提取,將提取的內(nèi)容進行重新組合,并關聯(lián)新的樣式表,以形成新的網(wǎng)頁內(nèi)容。由于篩除了樣式、廣告、外鏈等與主體內(nèi)容無關的節(jié)點,對網(wǎng)頁結構進行了簡化,能夠迅速定位到重要信息,減少對頁面內(nèi)容的大范圍遍歷,有利于網(wǎng)頁數(shù)據(jù)的采集。
進一步,由于本發(fā)明創(chuàng)造性地用JSON對象來記錄具有嵌套關系的網(wǎng)頁節(jié)點,此數(shù)據(jù)結構打破了DOM樹的數(shù)據(jù)結構,為后續(xù)進行內(nèi)容塊搜索提供了更加加速和靈活的方式。
另外,在主體內(nèi)容提取過程中,采用了從葉子節(jié)點開始回溯的算法,從基因值最長的節(jié)點開始提取主體內(nèi)容,更容易準確定位到主體內(nèi)容。
至此,已經(jīng)詳細描述了本發(fā)明。為了避免遮蔽本發(fā)明的構思,沒有描述本領域所公知的一些細節(jié)。本領域技術人員根據(jù)上面的描述,完全可以明白如何實施這里公開的技術方案。
可能以許多方式來實現(xiàn)本發(fā)明的方法以及裝置。例如,可通過軟件、硬件、固件或者軟件、硬件、固件的任何組合來實現(xiàn)本發(fā)明的方法以及裝置。用于所述方法的步驟的上述順序僅是為了進行說明,本發(fā)明的方法的步驟不限于以上具體描述的順序,除非以其它方式特別說明。此外,在一些實施例中,還可將本發(fā)明實施為記錄在記錄介質(zhì)中的程序,這些程序包括用于實現(xiàn)根據(jù)本發(fā)明的方法的機器可讀指令。因而,本發(fā)明還覆蓋存儲用于執(zhí)行根據(jù)本發(fā)明的方法的程序的記錄介質(zhì)。
雖然已經(jīng)通過示例對本發(fā)明的一些特定實施例進行了詳細說明,但是本領域的技術人員應該理解,以上示例僅是為了進行說明,而不是為了限制本發(fā)明的范圍。本領域的技術人員應該理解,可在不脫離本發(fā)明的范圍和精神的情況下,對以上實施例進行修改。本發(fā)明的范圍由所附權利要求來限定。