摘要:HTML頁(yè)面解析是一切工作的基礎(chǔ),通過(guò)分析HTML解析器感興趣的標(biāo)簽以及超鏈接的分類,在Java的Swing包的基礎(chǔ)上實(shí)現(xiàn)了一個(gè)HTML解析器,用來(lái)提取HTML文檔的超鏈接和錨文本;然后把HTML解析器應(yīng)用到多媒體信息檢索系統(tǒng)的搜索器Spider的開(kāi)發(fā)中,通過(guò)設(shè)定若干個(gè)種子網(wǎng)站,選擇合適的搜索算法,從中篩選出包含音頻、視頻和Flash動(dòng)畫的web頁(yè)面,并將其存放在數(shù)據(jù)庫(kù)中。
關(guān)鍵詞:解析器HTMLSwing超文本鏈接鏈接文本
中圖分類號(hào):G250
ImplementationandApplicationofHTMLParserBasedonSwing
SONGYu
LibraryofNanjingUniversityofChineseMedicine,Nanjing,JiangsuProvince,210023China
Abstract:HTMLpageparsingisthefoundationofallwork.ByanalyzingthetagsandclassificationofhyperlinksthatHTMLparsersareinterestedin,anHTMLparserhasbeenimplementedbasedonJava'sSwingpackagetoextracthyperlinksandanchortextfromHTMLdocuments; Then,theHTMLparserisappliedtothedevelopmentofthesearchengineSpiderformultimediainformationretrievalsystems.Bysettingseveralseedwebsitesandselectingappropriatesearchalgorithms,webpagescontainingaudio,video,andFlashanimationsarefilteredoutandstoredinadatabase.
KeyWords:Parser;HTML;Swing;Hyperlink;Linktext
HTML是一種標(biāo)記語(yǔ)言,其目的在于運(yùn)用標(biāo)記(tag)使文件達(dá)到預(yù)期的顯示效果;由于其簡(jiǎn)單易學(xué)的特點(diǎn),就算在各種Web設(shè)計(jì)語(yǔ)言競(jìng)爭(zhēng)發(fā)展的今天,它在Web設(shè)計(jì)中仍然具有無(wú)法被取代的地位,受到眾多Web設(shè)計(jì)人員的青睞;很多情況下,只需要HTML文檔中的部分信息,基于這種需求,HTML的解析技術(shù)受到許多人的關(guān)注;盡管現(xiàn)在有好多現(xiàn)成類似的例子程序,但它們提取的信息未必適合需求,因此仍然需要編制符合要求的HTML解析器。
本文在Java的Swing包的基礎(chǔ)上,對(duì)解析Web頁(yè)面遇到的困難給以分析并提出相應(yīng)的解決辦法,對(duì)其中的關(guān)鍵技術(shù)給出詳細(xì)說(shuō)明,實(shí)現(xiàn)了一個(gè)用于提取超鏈接的HTML解析器;并把該解析器用用到多媒體信息檢索系統(tǒng)的搜索器Spider[1-3]的開(kāi)發(fā)中。
1HTML解析器的實(shí)現(xiàn)
Java中Swing[4]包的HTML解析器類Parser是HTMLEditorKit類的內(nèi)部類,本文主要就是利用Parser類實(shí)現(xiàn)對(duì)HTML解析器的構(gòu)建。
1.1解析器感興趣的標(biāo)簽
HTML文檔標(biāo)簽[5]大致分為兩類:一類是傳輸數(shù)據(jù)的標(biāo)簽,如paragraph、table等,它們顯示web站點(diǎn)包含的信息;第二類是基礎(chǔ)結(jié)構(gòu)標(biāo)簽(infrastructuretags),這類標(biāo)簽指示瀏覽器如何從當(dāng)前頁(yè)面跳轉(zhuǎn)到其他頁(yè)面,常見(jiàn)的有<A>、<Area>和<Form>,這類標(biāo)簽需要提取。由于最終要提取出包含音頻、視頻和Flash動(dòng)畫的頁(yè)面,因此還需要提取包含這些多媒體數(shù)據(jù)的標(biāo)簽。在web頁(yè)面中,這些多媒體數(shù)據(jù)可以以鏈接的形式出現(xiàn),也可以嵌入Web頁(yè)面中,以鏈接形式出現(xiàn)的多媒體數(shù)據(jù)包含在標(biāo)簽<A>中,嵌入Web頁(yè)面中的多媒體數(shù)據(jù)包含在標(biāo)簽<object>和<embed>中。<embed>標(biāo)簽是Netscape的私有標(biāo)簽,用于Windows和Macintosh平臺(tái)下的NetscapeNavigator瀏覽器以及Macintosh平臺(tái)下的IE瀏覽器,這個(gè)標(biāo)簽應(yīng)用雖然廣泛,但并未被w3c收錄,因此使用此標(biāo)簽的Web頁(yè)面將通不過(guò)w3c校驗(yàn)。<object>標(biāo)簽w3c推薦使用,用于Windows平臺(tái)的IE瀏覽器,但這個(gè)標(biāo)簽在IE5-IE6/Win上必須下載完才能正常顯示。為了中和這兩者之間的矛盾,幾乎所有的Web設(shè)計(jì)者在嵌入多媒體數(shù)據(jù)時(shí),同時(shí)使用這兩個(gè)標(biāo)簽即把<embed>標(biāo)簽嵌套放在<object>標(biāo)簽內(nèi);因?yàn)檫@兩者包含的多媒體文件是同一個(gè),因此在實(shí)際提取過(guò)程中,只提取一個(gè)即可;由于<embed>標(biāo)簽未被w3c收錄,所以在Swing包中并不支持這個(gè)標(biāo)簽,因此只通過(guò)<object>標(biāo)簽來(lái)提?。ㄆ鋵?shí)多媒體文件的路徑是包含在這個(gè)標(biāo)簽的<param>標(biāo)簽中);除此之外,還要提取標(biāo)簽<Base>和<Frame>,各標(biāo)簽的作用如表1所示。
1.2超鏈接解析與分類
該解析器重點(diǎn)解析的信息是超鏈接,超鏈接包括鏈接地址URL和鏈接文本,其中鏈接地址URL包括兩類:絕對(duì)URL和相對(duì)URL。絕對(duì)URL是包含首頁(yè)域名的完整的網(wǎng)址,帶有http和www的鏈接,唯一確定一個(gè)頁(yè)面,而相對(duì)URL是不完整的,它依賴于它所在的頁(yè)面,要想解析相對(duì)URL,必須將它轉(zhuǎn)換為絕對(duì)URL。
頁(yè)面中的超鏈接反映的是頁(yè)面相互之間的邏輯關(guān)系,按照不同的標(biāo)準(zhǔn)和目的,可以區(qū)分為不同的類別。本文根據(jù)需要,把超鏈接分為站內(nèi)鏈接和站外鏈接。對(duì)于站內(nèi)鏈接又分為四類:(1)下行鏈,目標(biāo)頁(yè)面是當(dāng)前頁(yè)面的下級(jí)頁(yè)面;(2)上行鏈,目標(biāo)頁(yè)面是當(dāng)前頁(yè)面的上級(jí)頁(yè)面;這兩種類型是定義在Web站點(diǎn)邏輯層次結(jié)構(gòu)的垂直方向上的,統(tǒng)稱為垂直鏈;(3)水平鏈,目標(biāo)頁(yè)面和當(dāng)前頁(yè)面處于同一目錄;(4)交叉鏈,目標(biāo)頁(yè)面和當(dāng)前頁(yè)面不在同一路徑上。從以上描述可以看出,這種分類方法是根據(jù)頁(yè)面的物理結(jié)構(gòu)來(lái)區(qū)分的。超鏈接分類如圖1所示。
2.3實(shí)現(xiàn)過(guò)程
(1)建立TCP連接:首先通過(guò)DNS解析獲取改頁(yè)面對(duì)應(yīng)的IP地址,然后通過(guò)URLConnection建立與TCP連接,這個(gè)過(guò)程包括3次握手,以確保連接的可靠性。
(2)發(fā)起HTTP請(qǐng)求:向服務(wù)器發(fā)送HTTP請(qǐng)求,請(qǐng)求中包含請(qǐng)求行、請(qǐng)求頭和請(qǐng)求正文。請(qǐng)求行描述了客戶端的請(qǐng)求方式、請(qǐng)求的資源名稱以及使用的HTTP協(xié)議版本號(hào)。
(3)服務(wù)端進(jìn)行HTTP響應(yīng):服務(wù)器接收到請(qǐng)求后,返回一個(gè)HTTP響應(yīng),該響應(yīng)由狀態(tài)碼、響應(yīng)頭和實(shí)體內(nèi)容組成。狀態(tài)碼用于表示服務(wù)器對(duì)請(qǐng)求的處理結(jié)果,如2xx表示請(qǐng)求成功,4xx表示客戶端發(fā)生錯(cuò)誤等。如果成功,將網(wǎng)頁(yè)HTML代碼通過(guò)輸入流讀入閱讀器Reader中。
(4)調(diào)用解析器HTMLEditorKit.Parser對(duì)象的parse()方法,對(duì)HTML文檔進(jìn)行實(shí)際地解析。
(5)當(dāng)遇到<A>、<Area>、<Map>等包含鏈接地址的標(biāo)簽,則提取出該標(biāo)簽的屬性HREF值。
(6)同時(shí)提取該鏈接的錨文本,以作為該鏈接的內(nèi)容描述,并確保鏈接URL值與錨文本之間的一一對(duì)應(yīng)關(guān)系。
(7)將所有提取出來(lái)的鏈接URL和錨文本一并存入數(shù)據(jù)庫(kù)中。
2HTML解析器的系統(tǒng)應(yīng)用
將第二部分設(shè)計(jì)的HTML解析器應(yīng)用到多媒體信息檢索系統(tǒng)的搜索器Spider的開(kāi)發(fā)中。首先給定若干種子網(wǎng)站,然后利用本文第二部分構(gòu)造的HTML解析器、按照寬度優(yōu)先的爬行策略遍歷每個(gè)種子網(wǎng)站,提取出種子網(wǎng)站里所有包含音頻、視頻、Flash動(dòng)畫的網(wǎng)頁(yè)。由于該搜索器剛開(kāi)始做,所以目前只是在功能上的實(shí)現(xiàn),效率不是太高,爬行策略會(huì)在接下來(lái)的研究中繼續(xù)優(yōu)化。該系統(tǒng)大體包括5個(gè)模塊:種子鏈接初始化模塊、HTML解析模塊、爬行模塊、目標(biāo)網(wǎng)頁(yè)提取模塊、存儲(chǔ)模塊。
在該系統(tǒng)中,HTML解析模塊在本文的第二部分有詳細(xì)的說(shuō)明,在此就不在展開(kāi)敘述,該部分重點(diǎn)對(duì)該系統(tǒng)的其他4個(gè)模塊的作用與實(shí)現(xiàn)進(jìn)行闡述。
2.1種子鏈接初始化模塊
種子鏈接的提供一般有3種方法。第一種是手工尋找,這種方法由于有了人的判斷與篩選,選擇出的種子鏈接的質(zhì)量比較高,它一般包含較多的目標(biāo)頁(yè)面;其缺點(diǎn)也是顯而易見(jiàn),這種方法耗時(shí)耗力。第二種方法是通過(guò)元搜索引擎來(lái)提供,這種方法與第一種方法相反,雖然省去了人工的找尋階段,但其提供的種子鏈接的質(zhì)量沒(méi)有保證。第三種方法是允許用戶把他們自己的網(wǎng)站提交,經(jīng)確認(rèn)后加入種子鏈接列表,這種方法一般作為一種輔助手段,來(lái)配合前兩種方法進(jìn)行。由于目前這個(gè)系統(tǒng)還在試驗(yàn)階段,并為投入運(yùn)行,因此手工選擇了20個(gè)包含音頻、視頻、Flash動(dòng)畫較多的網(wǎng)站進(jìn)行測(cè)試,在以后會(huì)加入其他兩種方法來(lái)進(jìn)行種子鏈接的初始化。
2.2爬行模塊
在這一模塊,利用第二部分設(shè)計(jì)的HTML解析器,提取出頁(yè)面的所有鏈接,通過(guò)對(duì)鏈接進(jìn)行過(guò)濾,只保留與網(wǎng)頁(yè)文本的鏈接,然后按照寬度優(yōu)先的訪問(wèn)策略依次遍歷所有鏈接。在此,為了盡量避免遍歷到無(wú)關(guān)鏈接,對(duì)鏈接的訪問(wèn)進(jìn)行控制,指訪問(wèn)其內(nèi)部鏈接,而對(duì)外部鏈接暫時(shí)不考慮(但會(huì)在以后的研究中對(duì)其價(jià)值進(jìn)行判斷,據(jù)此來(lái)決定此鏈接的取舍)。其判斷方法如下:將超鏈接的URL地址與源網(wǎng)頁(yè)的URL地址進(jìn)行比較,如果兩地址只是在最后一個(gè)“/”間隔符后面的字符不同,則此鏈接為內(nèi)部鏈接,稱此鏈接與源鏈接有“親族”關(guān)系,按照與源鏈接的遠(yuǎn)近,又將這種“親族”關(guān)系細(xì)分為“父子”關(guān)系(指在物理存儲(chǔ)上該鏈接位于源鏈接所在目錄的一個(gè)子目錄中)和“兄弟”關(guān)系(指在物理存儲(chǔ)上該鏈接與源鏈接處在同一目錄下),若該鏈接與源鏈接不是“親族”關(guān)系,將其舍棄;通過(guò)這種處理后,每個(gè)種子鏈接將形成一棵“鏈接樹(shù)”,通過(guò)這棵樹(shù)對(duì)該網(wǎng)站的鏈接進(jìn)行大體分類,每個(gè)類別下的網(wǎng)頁(yè)存在某種程度的相關(guān)性,為將來(lái)尋找目標(biāo)頁(yè)面提供了便利;多個(gè)種子鏈接將形成多棵“鏈接樹(shù)”,它們共同形成“超鏈接樹(shù)林”;
為了避免對(duì)鏈接的重復(fù)訪問(wèn),為每個(gè)鏈接設(shè)置了訪問(wèn)狀態(tài),通過(guò)訪問(wèn)狀態(tài)把所有的鏈接分為4個(gè)隊(duì)列:(1)等待隊(duì)列,處于該隊(duì)列的鏈接表示等待被訪問(wèn),訪問(wèn)狀態(tài)為W;(2)運(yùn)行隊(duì)列,處于該隊(duì)列的鏈接表示正在被訪問(wèn),訪問(wèn)狀態(tài)為R;(3)完成隊(duì)列,處于該隊(duì)列的鏈接表示已經(jīng)被訪問(wèn)完畢,訪問(wèn)狀態(tài)為C;(4)錯(cuò)誤隊(duì)列,處于該隊(duì)列的鏈接表示在訪問(wèn)過(guò)程中發(fā)生錯(cuò)誤,訪問(wèn)狀態(tài)為E;在任一時(shí)刻,一個(gè)鏈接只能屬于一個(gè)隊(duì)列,稱之為鏈接狀態(tài),一個(gè)鏈接的鏈接狀態(tài)轉(zhuǎn)換如圖2所示。
2.3目標(biāo)網(wǎng)頁(yè)提取模塊
這一模塊的作用是在爬行模塊形成的“超鏈接樹(shù)林”中尋找包含音頻、視頻、Flash動(dòng)畫的頁(yè)面,目前采用的方法比較簡(jiǎn)單:依次取出“超鏈接樹(shù)林”中的每個(gè)鏈接進(jìn)行訪問(wèn),通過(guò)本文第二部分構(gòu)造的HTML解析器獲得每個(gè)鏈接頁(yè)面中的所有鏈接,如果所有的這些鏈接中有以音頻、視頻、Flash動(dòng)畫的擴(kuò)展名結(jié)尾的鏈接,將該鏈接對(duì)應(yīng)的頁(yè)面提取出來(lái)作為目標(biāo)頁(yè)面。這種方法簡(jiǎn)單易行,并且不會(huì)漏掉目標(biāo)頁(yè)面,即查全率比較高;但其缺點(diǎn)也很明顯,因?yàn)檫@種方法要對(duì)每個(gè)鏈接都要判斷一遍,所以效率太低,即查準(zhǔn)率太低。下一步會(huì)對(duì)這一模塊重點(diǎn)進(jìn)行改進(jìn),對(duì)每一鏈接的價(jià)值根據(jù)頁(yè)面內(nèi)容和鏈接結(jié)構(gòu)等提示性信息進(jìn)行判斷,根據(jù)鏈接的價(jià)值大小,決定是否訪問(wèn)此鏈接及訪問(wèn)的順序。
2.4存儲(chǔ)模塊
在這一模塊,采用Access數(shù)據(jù)庫(kù)分五個(gè)表對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),第一張表是SeedLink,這張表用來(lái)存放種子鏈接,其結(jié)構(gòu)如圖3所示。
第二張表是CrawlerLink這張表用來(lái)存放中間鏈接,即從種子鏈接中得到的所有內(nèi)部鏈接,也就是在爬行模塊中提到的“超鏈接樹(shù)林”中的所有鏈接,之所以也把中間鏈接也存儲(chǔ)在數(shù)據(jù)庫(kù)中而沒(méi)有放到內(nèi)存中,是因?yàn)殡S著鏈接的增多,在內(nèi)存中存放鏈接時(shí),其運(yùn)行效率會(huì)逐漸下降,其結(jié)構(gòu)如圖4所示。
第三張表是Video,第四張表是Audio,第五章表是Flash,這3張表是用來(lái)存放包含視頻、音頻和動(dòng)畫的頁(yè)面信息,其結(jié)構(gòu)相似,表Video的結(jié)構(gòu)如圖5所示。
3結(jié)語(yǔ)
對(duì)HTML文檔進(jìn)行解析是好多與網(wǎng)頁(yè)進(jìn)行交互系統(tǒng)的基礎(chǔ),由于各個(gè)系統(tǒng)的目的不同,對(duì)網(wǎng)頁(yè)元素的提取也各不相同,因此不存在一個(gè)通用的HTML解析器,因此本文構(gòu)造了一個(gè)用來(lái)提取網(wǎng)頁(yè)鏈接及鏈接文本的HTML解析器,并把此解析器應(yīng)用到多媒體信息檢索系統(tǒng)的搜索器Spider的開(kāi)發(fā)中,目前該系統(tǒng)尚處在實(shí)驗(yàn)階段,只是在功能上的實(shí)現(xiàn),對(duì)爬行算法并未進(jìn)行優(yōu)化,在下一步的工作中,將在爬行算法上進(jìn)一步研究。
參考文獻(xiàn)
[1]劉曉旭.主題網(wǎng)絡(luò)爬蟲(chóng)研究綜述[J].電腦知識(shí)與技術(shù),2024,20(8):97-99.
[2]郭婺,郭建,張勁松,等.基于Python的網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn)[J].信息記錄材料,2023,24(4):159-162.
[3]古志敏,吳明珠.基于Python網(wǎng)絡(luò)爬蟲(chóng)設(shè)計(jì)與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2023(9):163-166.
[4]王勇,洪進(jìn),杜蘭蘭,等.基于JavaSwing的找點(diǎn)軟件設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī),2022,28(16):96-100.
[5]楊大為,王詩(shī)念,包立巖,等.基于文本及HTML標(biāo)簽密度的網(wǎng)頁(yè)正文提取[J].沈陽(yáng)理工大學(xué)學(xué)報(bào),2022,41(4):14-19.