WebHarvest
李睿
2023-12-01
WebHarvest
理念
万维网,尽管是目前最大的知识基地,但仍然难以将它视为传统意义上的数据库,从而作为深入计算的所使用的信息源。WebHarves满足实用性的需求在正确的时间获取正确的数据。
基本概念
Web-Harvest是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有用的数据。Web-Harvest主要是运用了像XSLT,XQuery,正则表达式等这些技术来实现对text/xml的操作。Web-Harvest 主要着眼于目前仍占大多数的基于HMLT/XML 的页面内容。另一方面,它也能通过写自己的Java 方法来轻易扩展其提取能力。
Web-Harvest 的主要目的是加强现有数据提取技术的应用。它的目标不是创造一种新方法,而是提供一种更好地使用和组合现有方法的方式。它提供了一个处理器集用于处理数据和控制流程,每一个处理器被看作是一个函数,它拥有参数和执行后同样有结果返回。而且处理是被组合成一个管道的形式,这样使得它们可以以链式的形式来执行,此外为了更易于数据操作和重用,Web-Harvest 还提供了变量上下方用于存储已经声明的变量。
Web-Harvest 产生的数据以三种类型来呈现:text,binary 和list.
现在支持的语言有BeanShell,Groovy 和Javascript.BeanShell 可能是最接近JAVA 语法和强大的
预定义变量:sys(sys 包含了常用的常量和方法),http(http 提供了访问客户端和返回信息给HTTPresponses 的相关方法)
sys
对象sys 包含了常用的常量和方法,如下:
sys.lf 符号\n
sys.cr 符号\r
sys.tab 符号\t
sys.space 符号空格
sys.quot 符号’’
sys.apos 符号’
sys.backspace 符号\b
sys.date() 以yyyyMMdd的格式返回现在的日期
sys.time() 以HHmmss的格式返回现在的时间
sys.datetime(format) 以指定的格式返回时间或日期(用Java的格式)
sys.escapeXml(text) 根据XML的标准转义符号&’”<>
sys.fullUrl(pageUrl,link) 返回两个参数组成的完整URL
sys.defineVariable(varname,sarvalue,[overwrite]) 以指定的名字和值在当前上下文中定义一个新的变量,最后一个参数是定义是否覆盖同名的变量,默认为true;虽然它和var-def处理器有相同的意思,但是它在不同的脚本和上下文中交换数据时更有用。
sys.isVariableDefined(varname) 用于检查参数中指定名字的变量是否已经定义了
xpath(xpathexpr,xml) 返回org.wehharvest.runtime.variable.Variableclass的一个实例。
http
对象http 提供了访问客户端和返回信息给HTTPresponses 的相关方法:
http.client 返回在配置执行时用于基本的HTTP客户端的org.apache.commons.httpclient.HttpClient类的一个实例。
http.contentLength HTTPresponses内容的bytes长度
http.charset HTTPresponses文本的编码
http.mimeType HTTPresponses的MIME类型
http.headers HTTPresponsesheaders的映射, 访问单个的header, 请用http.header.get(‘headername’)
http.statusCode 最后一个HTTPresponses的状态码
http.statusText 最后一个HTTPresponses的状态消息
http.totalLength 返回到客户端的全部HTTPresponses的bytes的长度
http.totalResponse 返回到客户端的全部HTTPresponses的个数
处理器:
config:配置文件的根元素
语法
<config charset="charset_value" scriptlang="default_script_lang">
configuration body
</config>
empty:包装执行序列和返回空值。这个元素被用在当不在乎执行结果的情况下。
语法:
<empty>wrapped body</empty>
text:将嵌在其里面的值转化成字符串形式
语法:
<text>wrapped body</text>
var-def:定义或覆盖相同名字的变量
语法:
<var-def name="variable_name" overwrite="overwrite_existing">
body as value of the variable
</var-def>
var:返回name 里面指定的变量的值,如果该变量还没有定义则会抛出异常。
语法:
<var name="variable_name"/>
file:读写指定的文件
语法:
<file action="file_action" path="file_path" type="file_type" charset="charset_of_text_file">
body defining content of the file if action="write" or action="append"
</file>
属性:
属性名称 是否必要 默认值 描述
Action no read 对文件的动作:read,write,append
path yes 文件的路径,相对于工作目录
type no text 文件类型:text 或者binary
charset no config 里面的配置 文件的编码,如果类型是binary则无影响文件的编码。
http:发送HTTP 请求到指定的URL 并获取返回的结果
语法:
<http url="url" method="method" charset="charset" cookie-policy="cookie_policy"
username="username" password="password">
body that might contain http-param and/or http-header elements
</http>
http-param:为上面的http处理器添加参数,要在其里面定义,否则会抛出一个HTTP异常
语法:
<http-param name="param_name">body as parameter value </http-param>
http-header:为上面的HTTP 处理器定义HTTP header,要在其里面定义,否则会抛出一个异常。
语法:
<http-header name="header_name">body as header value</http-header>
html-to-xml:清除body 里面的内容并把它转换成有效的XML,因为body 通常是作为http 处理器执行得出的HTML。而里面真正的转换是委托给HtmlCleaner 工具的
语法:
<html-to-xml outputtype="..." advancedxmlescape="..." usecdata="..."
specialentities="..." unicodechars="..." omitunknowntags="..."
treatunknowntagsascontent="..." omitdeprtags="..."
treatdeprtagsascontent="..." omitcomments="..."
omithtmlenvelope="..." allowmultiwordattributes="..."
allowhtmlinsideattributes="..." namespacesawarei="..."
prunetags="...">
body as html to be cleaned
</html-to-xml>
属性:
属性名称 是否必要 默认值 描述
Outputtype no simple 定义结果的XML怎样被序列化,可配置为simple,compact,browser-compact和pretty.
advancedxmlescape no true 如果这个参数被设置成true,特殊字符(如&)后面的有效XML 字符序列(如&XXX)将不会被转义成&XXX;
usecdata no true 如果为真,HtmlCleaner 将把SCRIPT 和STYLE 标签当作CDATA 段来,否则会被当作普通文本(特殊字符将被转义).
specialentities no true 如果为真,特殊的HTML实体(如&ocric;,‰)会被它们所代表的unicode字符所替代,不包括&,<,>,’’,&apos
unicodechars no true 如果为真,以&#XXXX;这种形式出现的HTML 字符将会被它们对应的unicode 字符所替代
omitunknowtags no false 表明在清除的过程中是否跳过未知的标签
treatunknowtagsascontent no false 表明是否把未知的标签当作普通文本,本属性只有在omitunknowtags 为真时才有效。
omitdeprtags no false 表明是否跳过不标准的标签
treatdeprtagsascontent no false 表明是否把不标准的标签当作普通文本,只有在omitdeprtags 为false 时有效。
omitcomments no false 表明是否跳过评论/注释
omithtmlenvelope no false 表明是否移动HTML 和BODY 标签并用BODY 里面的第一个标签替代之,如果BODY 里面没标签则其不起作用
allowmultiwordattributes no true 如果为真,表明parser 是否将有多个字符串的属性当作单个,否则将其当作多个来对待
allowhtmlinsideattributes no false parser是否允许出现在属性值里面出现标签,只有allowmultiwordattributes 为真时才有用
namspaceaware no true 如果为真,转换过程中会将前缀的命名空间保存,还有将必要的XML 命名空间加到根元素去,否则,全部的命名空间则会被去掉。
prunetags no empty string 表明是否把用逗号分隔标签列表从XML 树中除去
reg-exp:从body 中寻找匹配所给的正则表达式的内容并且可配置是否替换之
语法:
<regexp replace="true_or_false" max="max_found_occurrences">
<regexp-pattern>body as pattern value</regexp-pattern>
<regexp-source>body as the text source</regexp-source>
[<regexp-result>body as the result</regexp-result>]
</regexp>
Xpath:用xpath语言表达式去XML 文档中匹配查找。
语法:
<xpath expression="xpath_expression">
body as xml
</xpath>
Xquery:用xquery语言表达式去XML 文档中匹配查找。
语法:
<xquery>
[<xq-param name="xquery_param_name" [type="xquery_param_type"]>
body as xquery parameter value
</xq-param>] *
<xq-expression>
body as xquery language construct
</xq-expression>
</xquery>
xslt:将xml 转换成xslt.
语法:
<xslt>
<xml>body as xml</xml>
<stylesheet>body as xsl</stylesheet>
</xslt>
script:执行用指定脚本编写的代码。Web-Harvest 支持的脚本语言有BeanShell,Groovy 和Javascript
script 处理器body 里面的代码以指定的脚本语言的语法来执行,并且可以可选地返回
给某个在return 属性里面指定的变量。所有在配置文件里面定义的变量都可以在script
处理器里面使用,不过,(请注意这里的“不过”)要先经过类型的转换后才能在里面使用,
比如你定义的变量是string 型的str,那么你要在script 里面str.toString()后才能当成
一个string 来使用,其它的转换函数还有:
•byte[] toBinary()
•boolean toBoolean()
•int toInt()
•long toLong()
•double toDouble()
•double toDouble()
•Object[] toArray()
•java.util.List toList()
•Object getWrappedObject()
语法:
<script language="script_language" return="value_to_return">
body as script</script>
template:用指定的脚本语言定义的变量来重新赋值给用${}包含着的部分,如果没有在这里
指定使用的脚本语言则会使用config 里面设置的脚本语言。
语法:
<template language="script_language">
body as text for templating
</template>
Case:执行一系列if 里面的条件语句,有一个为真则返回其body 里面的内容,如果没有
为真的则返回else 里面的body,如果没有定义body,则返回空值。
语法:
<case>
[<if condition="expression">if body</if>] *
[<else>else body</else>]
</case>
loop:迭代list里的每一项然后传到body里去执行,返回结果为body执行后得到的一列表
语法:
<loop item="link" index="i" filter="unique">
<list>
<xpath expression="//img/@src">
<html-to-xml>
<http url="http://www.yahoo.com"/>
</html-to-xml>
</xpath>
</list>
<body>
<file action="write" type="binary" path="images/${i}.gif">
<http url="${sys.fullUrl('http://www.yahoo.com', link)}"/>
</file>
</body>
</loop>
while:当条件为真进入循环,和其它语言的while 差不多。
语法:
<while condition="expression" index="index_var_name" maxloops="max_loops">
Body
</while>
return:返回用户定义的值
语法:
<return>body as return value</return>
call:调用用户定义的函数
语法:
<call name="function_name">
[<call-param name="function_name">body as actual parameter value</call-param>] *
</call>
Include:用户包含其它的配置文件和执行其里面的逻辑,这可以让你把常用的功能放在某
个文件里然后包含进来以达到缩小文件规模的目的。
语法:
<include path="file_path"/>
try and catch:封闭异常以返回catch 里面指定的值而不让异常打断整个流程。
语法:
<try>
<body>try body</body>
<catch>catch body</catch>
</try>
Exit:条件满足里会中断配置文件的执行。
<exit condition='${!sys.isVariableDefined("username")}' message="No username
provided!" />这里如果变量username没有定义的话则条件为真,那么配置文件就不被执行