【垂直搜索引擎搭建13】HtmlParser中Visitor实践
来源:互联网 发布:网站主持人源码 编辑:程序博客网 时间:2024/05/21 04:39
使用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:用来修改网页中的链接。
0 0
- 【垂直搜索引擎搭建13】HtmlParser中Visitor实践
- 【垂直搜索引擎搭建10】HtmlParser中Filter实践
- 【垂直搜索引擎搭建08】HtmlParser构建
- 【垂直搜索引擎搭建09】HtmlParser案例代码
- 【垂直搜索引擎搭建12】htmlparser简介
- 【垂直搜索引擎搭建14】HtmlParser中Filter方法(URL网络地址)
- 【垂直搜索引擎搭建15】HtmlParser中Filter方法(本地URL地址)
- 【垂直搜索引擎搭建11】使用htmlparser获取页面的字符编码encoding
- HtmlParser visitor
- 【垂直搜索引擎搭建01】heritrix环境搭建
- 【垂直搜索引擎搭建00】说在前面的话
- 【垂直搜索引擎搭建02】heritrix启动
- 【垂直搜索引擎搭建04】heritrix:扩展Extractor
- 【垂直搜索引擎搭建07】heritrix工具化
- 垂直搜索引擎
- 垂直搜索引擎框架(更新中)
- HTMLParser的visitor访问方式详解
- 【搜索引擎】HTMLParser - org.htmlparser.Node(1)
- 李开复给大学生的第1封信:从诚信谈起
- ImageView中src与background的区别
- HDU 5706 GirlCat DFS解决
- hive 内置操作符
- 传输层TCP协议
- 【垂直搜索引擎搭建13】HtmlParser中Visitor实践
- 创建UITableViewCell程序奔溃
- eclipse如何安装genymotion插件,终于安装成功了,终极方案
- 集合框架的讲解--面试常问问题
- linux把标准输出赋值给变量遇到的问题
- 我的webpack配置文件
- 树的同构
- 排序算法——快速排序
- Android.mk和Application.mk文件语法规范说明及举例