黄淑芹
(安徽财经大学 管理科学与工程学院,安徽 蚌埠 233030)
当前互联网已经成为最流行的信息发布媒体和最具潜力的资源,但目前Web上的数据大都以HTML形式出现,HTML通常是一个很难用程序手段处理的媒体.由于Web页面中的很多内容的格式编排不合理,使得现在的Web浏览器在进行HTML语法分析时非常不严谨,另外,现有的WEB数据主要目的是为了显示,用于浏览器浏览,缺乏对数据本身的描述,不含清晰的语义信息,模式也不太明确,这使得应用程序无法直接解析并利用Web上海量的信息,造成资源极大的浪费[1],如何充分应用web数据成为数据库技术研究的热点.
本文针对Web上半结构化的数据,构建一个半结构化的数据模型;然后研究一种半结构化模型抽取技术,它能自动地从现有数据中抽取半结构化模型的数据.
W3C开发的XML[2]是一种半结构化的数据模型,能使不同结构的数据很容易结合在一起[3],其数据内容和显示数据的格式是分离的,并且容易将XML的文档描述与关系数据库中的属性一一对应起来,实施精确地查询与模型抽取[4].XML提供了一个直接处理Web数据的通用方法,从根本上解决了Web文档和其他资源描述所面临的问题.基于XML从Web文档中抽取有用信息,以更为结构化的方式显示出来,为应用程序利用Web中的数据提供了可能.
从XML文档中提取信息的技术已经比较成熟,这里将信息接口和组织形式各不相同的非结构化的Web数据进行结构化处理.先将HTML转化成XHTML,然后根据抽取规则对XHTML文档进行处理,根据用户需求抽取有用信息形成XML文档.具体实现步骤如下:
①给定URL地址,获取HTML文档对象.
②使用HTML解析器解析获得的HTML文档对象,获得XHTML文档.
③根据用户需求,分析XHTML文档,构造XSL文件.
④根据XSL文件将XHTML文档映射成XML文件.
⑤将XML数据写入数据库.
在HTML向XHTML的转化过程中,借助于Tidy工具实现.Tidy[5]是一个免费使用的产品,可用于改正HTML文档中的常见错误并生成格式编排良好的XHTML文档.Tidy对文档进行数据清洗[6]后,采用基于树路径的抽取规则,用XSL确定数据内的引用点,并处理清洗过的XHTML文档,根据用户需求,抽取出信息,形成XML结构化文档.
基于XML的WEB数据抽取模型分成三个层次:用户接口层,数据抽取层,数据存储层.如图1所示.用户接口层负责将用户提交的查询命令提交给数据抽取层,并返回查询结果.数据抽取层完成数据的清洗、转换和抽取,将HTML文档进行规范化处理;把规范化后的HTML文档转化为XML文档,得到结构良好的数据.并将抽取结果返回用户界面或存入数据库.数据存储层保存上一层抽取的结构化数据,以结构化数据库形式进行存储.由于XML强调数据语义与元素之间的关系,因此可以很容易将XML的文档描述与关系数据库中的属性对应起来.在数据存储层建立多层次Web数据库,提供Web的多维分析与层次化视图[7].
用户界面用Java类来实现,因为Java的基本类提供了一套全面的图形用户界面类库.
数据库的连接用Java的JDBC实现,JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.
XML文档写入数据库时,先是建立与XML文档相对应的表结构,然后把数据写入DataTable,通过sqldataadapter直接把DataTable中的数据Update到数据库.
图1 基于XML的WEB数据抽取模型
这里以天气预报信息抽取为例.天气的变化使每天的预报信息都有所更新,及时分析和抽取各网页的天气预报信息,对做好恶劣天气防范工作、减少经济损失有重要意义.由于各个网站页面风格不同,这给用户获取信息造成不便.图2显示了2011年6月5日yahoo网站发布的蚌埠天气预报信息的屏幕快照.现在想抽取天气的温度、气压、湿度、可见度、露点、风力等信息.
图2 Yahoo发布的蚌埠天气预报信息网页
信息的抽取通过一个Java类ParseHTMLToXML实现.抽取的第一步首先将HTML数据转换成XHTML.通过Tidy库提供的函数在ParseHTMLToXML.tidyHTML()方法中转换.tidyHTML()方法接收一个由URL指定的Web地址作为参数,并将其转化为输入流(InputStream)对象,然后利用tidy的Parse方法清洗输入流,格式化后生成XHTML文档流(OutputStream)对象.outputXMLToFile()方法用于将XHTML文档流对象输出到一个指定路径的文件中.实现HTML转换成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) {
... }
}
转化成XHTML文档的界面如图3所示.
图3 文档清洗后形成XHTML的部分关键区域
Tidy清洗与格式化后文档中大多数信息依然与最终数据表现形式无关,因此需要在XML文档中找出特定区域,从该区域中抽取数据,而无需过多关心其他冗余数据[8].根据XHTML文档可以知道要抽取的信息在一个
/html/body/div/div/div/div/div/div
这个表达式指定了从根 元素到锚div的路径.绝对路径表达式的方法会导致页面布局发生改变时查找失效.所以采用仅与内容相关而与格式无关的相对路径指定锚.这时XPath表达式改为:
//div[starts-with(normalize-space(.), 'Feels Like')]
XSL是由XML派生的语言,使用XSLT通过模式与模板相结合来转换XML文档[10],主要用于设置数据的格式,实现了信息内容和显示格式分离.这里建立一个XSL文件,用来标识锚,指定如何从锚获取查找的数据,以我们所需的格式构造一个XML输出文件显示查找的数据.
XSL文件部分代码如下:
应用XSL文件把前面得到的XHTML文档转化为XML文档,实现该转化的代码如下:
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()方法实现对抽取的XHTML文档在指定的XSL的映射下进行变换,并调用outputXMLToFile()方法将其输出到一个xml文件中.
如果仅抽取一次,建立一个XML输出文件就完成了.如果执行多次抽取,则可以通过建立的MergeXML方法,把当前抽取中获得的数据合并到以前抽取数据的XML文件中,并可以通过该文件观察数据抽取的正确性.
抽取的数据可以直接作为结果辅助决策,也可以存入数据库直接保存.直接存入数据库的代码如下:
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();
随着网络的迅猛发展,WEB信息抽取会变得越来越重要.本系统移植性较好,大部分代码可以重复使用,通过选择与内容相关但与格式无关的锚,可以方便、快捷地抽取所需的信息.
参考文献:
[1]陈佳,胡燕,轩艳艳.一种基于XML的Web信息抽取方法[J].计算机数字与工程,2007,38(6):101~103.
[2]范立峰.XML实用教程[M].北京:人民邮电出版社,2009:1~13.
[3]周晓梅,王潜平,苏琳.基于XML的Web数据挖掘模型的设计[J].计算机工程与设计,2007,28(2):272~274,277.
[4]李姗,黄水源.基于XML的WEB信息抽取模型设计[J].微计算机信息,2009,25(3-3):207~208,211.
[5]HTML Tidy[EB/OL].http://www.w3.org/MarkUp/
[6]毛国君,段立娟,等.数据挖掘原理与算法[M].北京:清华大学出版社,2007:39~43.
[7]周翔.基于XML的web内容挖掘研究[D].重庆:重庆大学,2007.
[8]盖磊,王海军,刘俊民.一种基于XML的Web地震信息抽取的实现[J].计算机应用与软件,2007,24(8):103~105.
[9]陈佳.基于XML的Web信息抽取技术的应用研究[D].湖北:武汉理工大学,2007.
[10]陈景霞,张鹏伟.基于XML的Web数据挖掘模型的研究[J].情报杂志,2006(11):100~102.