【垂直搜索引擎搭建13】HtmlParser中Visitor实践

本文介绍使用NodeVisitor模式访问HTML节点的方法。包括初始化Parser、创建Visitor并遍历节点,重点讲解了不同类型的节点访问过程及系统提供的八种Visitor功能。

使用NodeVisitor方式访问html结点

package com.javaeye.suo.htmlparser.samples;

import org.htmlparser.Parser;
import org.htmlparser.Remark;
import org.htmlparser.Tag;
import org.htmlparser.Text;
import org.htmlparser.visitors.NodeVisitor;

import com.javaeye.suo.htmlparser.HtmlParserUtils;

public class VisitorDemo extends NodeVisitor{
    //记录Remark Node数量
    private int remark_node_count;
    //记录Text Node数量
    private int tag_node_count;
    //记录Tag Node数量
    private int text_node_count;

    public void visitRemarkNode(Remark remark) {
        System.out.println("正在访问第 "+(++remark_node_count)+" 个Remark Node ");
    }

    public void visitStringNode(Text text) {
        System.out.println("正在访问第 "+(++tag_node_count)+" 个Text Node ");
    }

    public void visitTag(Tag tag) {
        System.out.println("正在访问第 "+(++text_node_count)+" 个Tag Node ");
    }

    public static void main(String[] args) {
        try{
                        //方式一:
            String urlStr = "http://localhost:8080/HtmlParser/htmlparser.html";
            Parser parser = HtmlParserUtils.getParserWithUrlConn(urlStr, "utf-8");

            NodeVisitor visitor = new VisitorDemo ();
                    parser.visitAllNodesWith (visitor);

                        System.out.println("=========================================");
                        //方式二(常用):
                        parser.reset();
                        NodeVisitor visitor2 = new NodeVisitor() {
                        public void visitTag(Tag tag) {
                            System.out.println("正在访问的tag:" + tag.getTagName() + "  ||  Class is :"+ tag.getClass());
                        }
                    };
                    parser.visitAllNodesWith(visitor2);


        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

一、 Visitor方式访问Html:

1,整体解析过程

  • 用一个URL或页面String做一个Parser
  • 用这个Parser做一个Visitor
  • 使用Parser.visitAllNodeWith(Visitor)来遍历节点
  • 获取Visitor遍历后得到的数据

2,Visit过程

  • 做解析之前做的事情:visitor.beginParsing();
  • 每次取到一个节点Node,让该Node接受accept该Visitor
  • 做解析后做的事情:visitor.finishedParsing();

3,获取节点的过程:

逐步遍历Html,分析出Node。此部分较为复杂,且对于我们应用来说无需很多了解,暂跳过。

4,节点访问
      节点访问采用Visitor模式,Node的accept方法和具体Visitor的visit方法是关键。
      首先三类Node来accept的方式各不相同:

  • 对于所有TagNode都使用一个accept方法,即TagNode的accept方法。首先判断是否是标签结尾,如果是就visitor.visitEndTag(this);否则visitor.visitTag (this);
  • 如果是TextNode,那就visitor.visitStringNode (this);就可以了。
  • 如果是RemarkNode,那就visitor.visitRemarkNode (this);就可以了。

    实际上NodeVisitor里边这四种visit方法都是空的,因为在不同的Visitor中对于这三类节点的处理是不同的;对于需要处理的节点,只要重载对应的visit方法就行了,如果不处理那就不理会就可以了;另外,如果用户用自己的Visitor,那么还可以灵活的处理不同类型的节点了。
    系统为我们实现了下面我要介绍的8种Visitor,实际上可以看作是系统给我们演示了如何做各种各样的Visitor来访问Html,因为实际上我们要真正来用HtmlParser的话,还需要特定的Visitor,而通过简单的这些系统提供的Visitor组合是难以做成什么事情的。

二、系统Visitor功能简介:

  • ObjectFindingVisitor:用来找出所有指定类型的节点,采用getTags()来获取结果。
  • StringBean:用来从一个指定的URL获取移除了<SCRIPT>``</SCRIPT><PRE>``</PRE>之间代码的Html代码,也可以用做Visitor,用来移除这两种标签内部的代码,采用StringBean.getStrings()来获取结果。
  • HtmlPage:提取Title,body中的节点和页面中的TableTag节点。
  • LinkFindingVisitor:找出节点中包含某个链接的总个数。
  • StringFindingVisitor:找出遍历的TextNode中含有指定字符串的个数。
  • TagFindingVisitor:找出指定Tag的所有节点,可以指定多种类型。
  • TextExtractingVisitor:从网页中把所有标签去掉来提取文本,这个提取文本的Visitor有时是很实用的,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签之间的文本,例如<a>中的链接也去掉了。
  • UrlModifyingVisitor:用来修改网页中的链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值