黃淑芹
(安徽財經(jīng)大學(xué) 管理科學(xué)與工程學(xué)院,安徽 蚌埠 233030)
當(dāng)前互聯(lián)網(wǎng)已經(jīng)成為最流行的信息發(fā)布媒體和最具潛力的資源,但目前Web上的數(shù)據(jù)大都以HTML形式出現(xiàn),HTML通常是一個很難用程序手段處理的媒體.由于Web頁面中的很多內(nèi)容的格式編排不合理,使得現(xiàn)在的Web瀏覽器在進行HTML語法分析時非常不嚴謹,另外,現(xiàn)有的WEB數(shù)據(jù)主要目的是為了顯示,用于瀏覽器瀏覽,缺乏對數(shù)據(jù)本身的描述,不含清晰的語義信息,模式也不太明確,這使得應(yīng)用程序無法直接解析并利用Web上海量的信息,造成資源極大的浪費[1],如何充分應(yīng)用web數(shù)據(jù)成為數(shù)據(jù)庫技術(shù)研究的熱點.
本文針對Web上半結(jié)構(gòu)化的數(shù)據(jù),構(gòu)建一個半結(jié)構(gòu)化的數(shù)據(jù)模型;然后研究一種半結(jié)構(gòu)化模型抽取技術(shù),它能自動地從現(xiàn)有數(shù)據(jù)中抽取半結(jié)構(gòu)化模型的數(shù)據(jù).
W3C開發(fā)的XML[2]是一種半結(jié)構(gòu)化的數(shù)據(jù)模型,能使不同結(jié)構(gòu)的數(shù)據(jù)很容易結(jié)合在一起[3],其數(shù)據(jù)內(nèi)容和顯示數(shù)據(jù)的格式是分離的,并且容易將XML的文檔描述與關(guān)系數(shù)據(jù)庫中的屬性一一對應(yīng)起來,實施精確地查詢與模型抽取[4].XML提供了一個直接處理Web數(shù)據(jù)的通用方法,從根本上解決了Web文檔和其他資源描述所面臨的問題.基于XML從Web文檔中抽取有用信息,以更為結(jié)構(gòu)化的方式顯示出來,為應(yīng)用程序利用Web中的數(shù)據(jù)提供了可能.
從XML文檔中提取信息的技術(shù)已經(jīng)比較成熟,這里將信息接口和組織形式各不相同的非結(jié)構(gòu)化的Web數(shù)據(jù)進行結(jié)構(gòu)化處理.先將HTML轉(zhuǎn)化成XHTML,然后根據(jù)抽取規(guī)則對XHTML文檔進行處理,根據(jù)用戶需求抽取有用信息形成XML文檔.具體實現(xiàn)步驟如下:
①給定URL地址,獲取HTML文檔對象.
②使用HTML解析器解析獲得的HTML文檔對象,獲得XHTML文檔.
③根據(jù)用戶需求,分析XHTML文檔,構(gòu)造XSL文件.
④根據(jù)XSL文件將XHTML文檔映射成XML文件.
⑤將XML數(shù)據(jù)寫入數(shù)據(jù)庫.
在HTML向XHTML的轉(zhuǎn)化過程中,借助于Tidy工具實現(xiàn).Tidy[5]是一個免費使用的產(chǎn)品,可用于改正HTML文檔中的常見錯誤并生成格式編排良好的XHTML文檔.Tidy對文檔進行數(shù)據(jù)清洗[6]后,采用基于樹路徑的抽取規(guī)則,用XSL確定數(shù)據(jù)內(nèi)的引用點,并處理清洗過的XHTML文檔,根據(jù)用戶需求,抽取出信息,形成XML結(jié)構(gòu)化文檔.
基于XML的WEB數(shù)據(jù)抽取模型分成三個層次:用戶接口層,數(shù)據(jù)抽取層,數(shù)據(jù)存儲層.如圖1所示.用戶接口層負責(zé)將用戶提交的查詢命令提交給數(shù)據(jù)抽取層,并返回查詢結(jié)果.數(shù)據(jù)抽取層完成數(shù)據(jù)的清洗、轉(zhuǎn)換和抽取,將HTML文檔進行規(guī)范化處理;把規(guī)范化后的HTML文檔轉(zhuǎn)化為XML文檔,得到結(jié)構(gòu)良好的數(shù)據(jù).并將抽取結(jié)果返回用戶界面或存入數(shù)據(jù)庫.數(shù)據(jù)存儲層保存上一層抽取的結(jié)構(gòu)化數(shù)據(jù),以結(jié)構(gòu)化數(shù)據(jù)庫形式進行存儲.由于XML強調(diào)數(shù)據(jù)語義與元素之間的關(guān)系,因此可以很容易將XML的文檔描述與關(guān)系數(shù)據(jù)庫中的屬性對應(yīng)起來.在數(shù)據(jù)存儲層建立多層次Web數(shù)據(jù)庫,提供Web的多維分析與層次化視圖[7].
用戶界面用Java類來實現(xiàn),因為Java的基本類提供了一套全面的圖形用戶界面類庫.
數(shù)據(jù)庫的連接用Java的JDBC實現(xiàn),JDBC是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成.
XML文檔寫入數(shù)據(jù)庫時,先是建立與XML文檔相對應(yīng)的表結(jié)構(gòu),然后把數(shù)據(jù)寫入DataTable,通過sqldataadapter直接把DataTable中的數(shù)據(jù)Update到數(shù)據(jù)庫.
圖1 基于XML的WEB數(shù)據(jù)抽取模型
這里以天氣預(yù)報信息抽取為例.天氣的變化使每天的預(yù)報信息都有所更新,及時分析和抽取各網(wǎng)頁的天氣預(yù)報信息,對做好惡劣天氣防范工作、減少經(jīng)濟損失有重要意義.由于各個網(wǎng)站頁面風(fēng)格不同,這給用戶獲取信息造成不便.圖2顯示了2011年6月5日yahoo網(wǎng)站發(fā)布的蚌埠天氣預(yù)報信息的屏幕快照.現(xiàn)在想抽取天氣的溫度、氣壓、濕度、可見度、露點、風(fēng)力等信息.
圖2 Yahoo發(fā)布的蚌埠天氣預(yù)報信息網(wǎng)頁
信息的抽取通過一個Java類ParseHTMLToXML實現(xiàn).抽取的第一步首先將HTML數(shù)據(jù)轉(zhuǎn)換成XHTML.通過Tidy庫提供的函數(shù)在ParseHTMLToXML.tidyHTML()方法中轉(zhuǎn)換.tidyHTML()方法接收一個由URL指定的Web地址作為參數(shù),并將其轉(zhuǎn)化為輸入流(InputStream)對象,然后利用tidy的Parse方法清洗輸入流,格式化后生成XHTML文檔流(OutputStream)對象.outputXMLToFile()方法用于將XHTML文檔流對象輸出到一個指定路徑的文件中.實現(xiàn)HTML轉(zhuǎn)換成XHTML(XML的子集)的代碼如下.
public static void main(String args[]) {
try {
Document doc = ParseXHTMLToXML.tidyHTML(“http://weather.yahoo.com/china/anhui/bengbu-2127869/”);
ParseXHTMLToXML.outputXMLToFile(doc, “XML” + File.separator + “FORECASTS.xml”);
} catch (ParseXHTMLToXMLException xmle) {
... }
}
轉(zhuǎn)化成XHTML文檔的界面如圖3所示.
圖3 文檔清洗后形成XHTML的部分關(guān)鍵區(qū)域
Tidy清洗與格式化后文檔中大多數(shù)信息依然與最終數(shù)據(jù)表現(xiàn)形式無關(guān),因此需要在XML文檔中找出特定區(qū)域,從該區(qū)域中抽取數(shù)據(jù),而無需過多關(guān)心其他冗余數(shù)據(jù)[8].根據(jù)XHTML文檔可以知道要抽取的信息在一個
/html/body/div/div/div/div/div/div
這個表達式指定了從根 元素到錨div的路徑.絕對路徑表達式的方法會導(dǎo)致頁面布局發(fā)生改變時查找失效.所以采用僅與內(nèi)容相關(guān)而與格式無關(guān)的相對路徑指定錨.這時XPath表達式改為:
//div[starts-with(normalize-space(.), 'Feels Like')]
XSL是由XML派生的語言,使用XSLT通過模式與模板相結(jié)合來轉(zhuǎn)換XML文檔[10],主要用于設(shè)置數(shù)據(jù)的格式,實現(xiàn)了信息內(nèi)容和顯示格式分離.這里建立一個XSL文件,用來標(biāo)識錨,指定如何從錨獲取查找的數(shù)據(jù),以我們所需的格式構(gòu)造一個XML輸出文件顯示查找的數(shù)據(jù).
XSL文件部分代碼如下:
應(yīng)用XSL文件把前面得到的XHTML文檔轉(zhuǎn)化為XML文檔,實現(xiàn)該轉(zhuǎn)化的代碼如下:
public static void main(String args[]) {
try {
Document xhtml = ParseHTMLToXML.parseXMLFromURLString(“file://FORECASTS.xml”);
Document xsl= ParseHTMLToXML.parseXMLFromURLString(“file://XSL/FORECASTS.xsl”);
Document xml = ParseHTMLToXML.transformXML(xhtml, xsl);
ParseXHTMLToXML.outputXMLToFile(“XML” + File.separator + “result.xml”);
} catch (ParseXHTMLToXMLException xmle) {
// ... Do Something ...
}
}
其中parseXMLFromURLString()和transformXML()方法實現(xiàn)對抽取的XHTML文檔在指定的XSL的映射下進行變換,并調(diào)用outputXMLToFile()方法將其輸出到一個xml文件中.
如果僅抽取一次,建立一個XML輸出文件就完成了.如果執(zhí)行多次抽取,則可以通過建立的MergeXML方法,把當(dāng)前抽取中獲得的數(shù)據(jù)合并到以前抽取數(shù)據(jù)的XML文件中,并可以通過該文件觀察數(shù)據(jù)抽取的正確性.
抽取的數(shù)據(jù)可以直接作為結(jié)果輔助決策,也可以存入數(shù)據(jù)庫直接保存.直接存入數(shù)據(jù)庫的代碼如下:
DriverManager.registerDriver(new oracle jdbc driver OracleDriver());
Connection conn=DriverManager. getConnection(“jdbc oracle oci8@”, “username”, “password”);
Oracle.xml.sql.dml.OracleXMLSave Sav=new OracleXMLSave(conn,“tblname”);
Sav.insertXML(xmlOut);
Sav.close();
隨著網(wǎng)絡(luò)的迅猛發(fā)展,WEB信息抽取會變得越來越重要.本系統(tǒng)移植性較好,大部分代碼可以重復(fù)使用,通過選擇與內(nèi)容相關(guān)但與格式無關(guān)的錨,可以方便、快捷地抽取所需的信息.
參考文獻:
[1]陳佳,胡燕,軒艷艷.一種基于XML的Web信息抽取方法[J].計算機數(shù)字與工程,2007,38(6):101~103.
[2]范立峰.XML實用教程[M].北京:人民郵電出版社,2009:1~13.
[3]周曉梅,王潛平,蘇琳.基于XML的Web數(shù)據(jù)挖掘模型的設(shè)計[J].計算機工程與設(shè)計,2007,28(2):272~274,277.
[4]李姍,黃水源.基于XML的WEB信息抽取模型設(shè)計[J].微計算機信息,2009,25(3-3):207~208,211.
[5]HTML Tidy[EB/OL].http://www.w3.org/MarkUp/
[6]毛國君,段立娟,等.數(shù)據(jù)挖掘原理與算法[M].北京:清華大學(xué)出版社,2007:39~43.
[7]周翔.基于XML的web內(nèi)容挖掘研究[D].重慶:重慶大學(xué),2007.
[8]蓋磊,王海軍,劉俊民.一種基于XML的Web地震信息抽取的實現(xiàn)[J].計算機應(yīng)用與軟件,2007,24(8):103~105.
[9]陳佳.基于XML的Web信息抽取技術(shù)的應(yīng)用研究[D].湖北:武漢理工大學(xué),2007.
[10]陳景霞,張鵬偉.基于XML的Web數(shù)據(jù)挖掘模型的研究[J].情報雜志,2006(11):100~102.