试用Web-Harvest 使用手册
Web-Harvest是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有
用的数据。Web-Harvest主要是运用了像XSLT,XQuery,正则表达式等这些技术来实现对text/xml的操作。
?????? 个人感觉,这个工具的设计构想很好,利用写好的xml脚本把指定的html转化成xml,然后再利用xml
解析器从中抽取信息。这样在编写网页信息抽取工具时,我们就不用担心网页格式的变化,会影响到信息
抽取的结果,因为整个抽取信息的部分都是通过配置对应的脚本实现的,我们只要修改脚本就可以了,不
用更改程序代码。
?下面是我按照这个开源工具自己带的例子改写的一个提取yahoo搜索信息的脚本,用Web-Harvest执行它
,可以提取以"KMS"为关键字在yahoo搜索引擎上搜索得到的结果。
脚本xml:
<?xml version="1.0" encoding="UTF-8"?>
<config charset="ISO-8859-1">
???
??? <include path="functions.xml"/>
???
??? <var-def name="search">KMS</var-def>
?<var-def name="url">
???? <template>http://search.yahoo.com/search?p=${search}</template>
?</var-def>
???????????
??? <!-- collects all tables for individual products -->
??? <var-def name="products">???
??????? <call name="download-multipage-list">
??????????? <call-param name="pageUrl"><var name="url"/></call-param>
??????????? <call-param name="nextXPath">//big[.='Next']/a/@href</call-param>
??????????? <call-param name="itemXPath">//ol/li</call-param>
??????????? <call-param name="maxloops">10</call-param>
??????? </call>
??? </var-def>
???
??? <!-- iterates over all collected products and extract desired data -->
??? <file action="write" path="myyahoo.xml" charset="UTF-8">
??????? <![CDATA[ yahoo ]]>
??????? <loop item="item" index="i">
??????????? <list><var name="products"/></list>
??????????? <body>
??????????????? <xquery>
??????????????????? <xq-param name="item"><var name="item"/></xq-param>
??????????????????? <xq-expression><![CDATA[
??????????????????????????? let $name := data($item//div[1]/a[1])
??????????????????????????? let $src := data($item//div[1]/a[1]/@href)
??????????????????????????? let $abs := data($item//div[2])
??????????????????????????????? return
??????????????????????????????????? <product>
??????????????????????????????????????? <name>{normalize-space($name)}</name>
??????????????????????????????????????? <src>{normalize-space($src)}</src>
??????????????????????????????????????? <abs>{normalize-space($abs)}</abs>
??????????????????????????????????? </product>
??????????????????? ]]></xq-expression>
??????????????? </xquery>
??????????? </body>
??????? </loop>
??????? <![CDATA[ yahoo ]]>
??? </file>
</config>
结果xml:
<yahoo><product>
?? <name>KMSResearch</name>
?? <src>http://rds.yahoo.com/_ylt=A0geuodL05lFpaEArQxXNyoA;_ylu=X3oDMTB2b2gzdDdtBGNvb
G8DZQRsA1dTMQRwb3MDMQRzZWMDc3IEdnRpZAM-/SIG=11fph2etm/EXP=1167795403/**http%3a//www.kmshaircare.com/</src>
?? <abs>Learn about each subbrand which has its own purpose and look to support your way of
life, mood, or whim.</abs>
</product>
.
.
.
<product>
?? <name>Summer - KMS promotional items</name>
?? <src>http://rds.yahoo.com/_ylt=A0geupZ705lFwVkAMQZXNyoA;_ylu=X3oDMTExYm1vY2p0BGNvb
G8DZQRsA1dTMQRwb3MDMTAwBHNlYwNzcgR2dGlkAw--/SIG=11q4tb45p/EXP=1167795451/**http%3a//kms-fra.com/en/products/sommer/</src>
?? <abs>KMS Design. Special designs. Onpacks and Inpacks ... KMS presents the smallest solar
charger available. ... The KMS SoftFrisbee - this UFO is foldable! ...</abs>
</product></yahoo>
??????? 如果你对xml,xpath,xquery这些技术都有了解,在看过Web-Harvest的帮助(http://web-harvest.sourceforge.net/manual.php)后,相信上面的脚本xml应该不难理解。
?????? 在整个试用过程中,我也发现了Web-Harvest的一些问题,比如他使用tagsoup对html网页进行清洗
,会造成一些格式不太规范的网页数据丢失(比如google的搜索页面),希望Web-Harvest的开发者能够
注意到这个问题,毕竟现在能够严格遵守HTML4.0规范的网页并不多,更多的是xml出现之前就已经存在
的网页。现在的web信息抽取使用xml技术实现无疑是最理想的,而Web-Harvest已经为我们搭建了一个
可供选择的抽取模型,如何解决对大量不规范网页的无损xml转换,将是这个工具能否运用到实际中的关
键环节。
??????? 还有,由于本人水平有限,在利用Web-Harvest抽取中文的网页,还没发现完全没有乱码的网页。
??????? 这篇文章的目的是希望能够抛砖引玉,能有更多的人关注Web-Harvest这个工具。因为Web-Harvest
还有很多高级的应用我还没有研究;还有很多需要改进的地方。但它至少给我一个启示,完全结构化的,
动态化的网页信息抽取是可以实现的,而且并不难。
参考文献:
Web-Harvest:http://web-harvest.sourceforge.net/
XPath教程:http://www.zvon.org/xxl/XPathTutorial/Output_chi/introduction.html
XQuery教程:http://www.w3pop.com/tech/school/xquery/default.asp
?
?