Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40044
  • 博文数量: 6
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-05 14:17
文章分类

全部博文(6)

文章存档

2013年(5)

2012年(1)

我的朋友

分类: Java

2013-04-08 22:45:10

      Web-Harvest是一开源的Web信息抽取工具,提供了正则表达式,XPath,XSLT,XQuery等提取方法。其最大特点是可配置性,用户负责编辑提取配置文件,而其只负责解析配置文件、按配置规定的逻辑和提取方法提起数据,这样就最大限度了满足了用户灵活多变的需求。 Web-Harvest的提取配置支持顺序,分支,循环等逻辑控制原语,支持变量定义和引用,支持函数定义和调用,内嵌多种脚本引擎,从而定义了一套自己的微型语言,收获了数据驱动编程的各种益处。Web-Harvest还提供了图形界面,方便编写和调试提取配置文件。

   Web-Harvest提取配置的编写也比较容易上手,下面是提取新浪微博首页中微博的配置文件示例。做了一些简化,省去了从登陆到获取首页的过程(可参考项目自带的例子yahoomail.xml),省去了从脚本的参数中抠出包含微博列表的过程(以前的版本是静态页面展示,相对比较容易提取)。



 
        ]]>
       
           
             
                
                  
                

              

           

           
               
                   
                                                declare variable $item as node() external;


                            let $MessageId := data($item//@mid)
                            let $IsForward := data($item//@isForward)
                            let $PublisherNickName := data($item//div[@class='WB_face']/a/@title)
                            let $Content := data($item//div[@node-type='feed_list_content'])
                            let $ForwardNickName := data($item//div[@node-type='feed_list_forwardContent']//a[@class='WB_name S_func3']/@nick-name)
                            let $ForwardContent := data($item//div[@node-type='feed_list_forwardContent']//div[@node-type='feed_list_reason']/em)
                                return
                                   
                                        {normalize-space($MessageId)}
                                        {normalize-space($IsForward)}
                                        {normalize-space($PublisherNickName)}
                                        {normalize-space($Content)}
                                       
                                        {normalize-space($ForwardNickName)}
                                        {normalize-space($ForwardNickName)}
                                       

                                   

                    ]]>

               

           
       

        ]]>
   


  
Web-Harvest的提取配置其实更符合机器的习惯,在最里层的内容先被执行,比如上例中的list的实际处理过程是,先把html文件读进来,再做从html到xhtml的转换,再运用XPath表达式,最终得到符合条件的列表;Web-Harvest的执行效率比较低,在我的机器上,抽取新浪微博首页需要469ms,其中获得list的XPath表达式占了320ms,效率低的原因可能包括:整个提取的递归执行,边解释边执行(没有编译过程,下次提取同样的新浪首页跟上次时间相同);Web-Harvest没有提供一些格式转换,比如新浪微博首页需要把代码中的转义符去掉,一些解码方法,比如UNICODE,UTF-8,URL等,没有提供对名值对集合这种返回值的支持(只有str,list,empty,参见源码中的Variable及其子类代码),像url中的param,form-url格式数据都有这种需求,可能上述需求都比较小众化吧。

   Web-Harvest并没有提供一个完整的Web信息抽取框架,但其实现还是有很多值得学习的地方,如对配置微型语言的良好抽象,巧妙的利用递归,从配置到内部抽象的表驱动转换法等。




阅读(2716) | 评论(0) | 转发(0) |
0

上一篇:进程能打开的最大文件数

下一篇:没有了

给主人留下些什么吧!~~