`
wode66
  • 浏览: 744028 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HtmlParser学习笔记(三)-- 使用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:用来修改网页中的链接。

 

 

分享到:
评论

相关推荐

    HtmlParser学习笔记-- htmlparser简介

    Node接口定义了一系列方法,包括获取父节点、子节点和兄弟节点,将节点转换为HTML文本,确定节点在原始HTML源码中的位置,以及实现过滤和Visitor访问模式。这些方法使得开发者能够遍历和操作HTML文档的结构。 2. **...

    前端开源库-parse5-htmlparser2-tree-adapter

    在`parse5-master`这个压缩包中,很可能包含了parse5库的源码和相关资源,你可以通过阅读源码、查看示例和文档来更深入地理解这个库的工作原理,以及如何有效地使用`parse5-htmlparser2-tree-adapter`。同时,熟悉这...

    HTMLParser-2.0-SNAPSHOT

    这个"HTMLParser-2.0-SNAPSHOT"版本可能是HTMLParser的一个开发版本或测试版本,包含了最新的特性和改进。 HTMLParser提供了丰富的API,使得开发者可以方便地操作HTML元素,如标签、属性和文本。以下是一些关键的...

    java解析html工具htmlparser的jar包及api文档

    在提供的压缩包中,`HTMLParser-2.0-SNAPSHOT-bin`可能是可执行的二进制文件,包括了编译好的JAR文件和其他运行所需的资源。而`HTMLParser-2.0-SNAPSHOT`可能包含了源代码,这对于开发者来说是宝贵的,因为他们可以...

    前端开源库-htmlparser-to-html

    1. **数据解析**:在爬虫项目中,可以使用`htmlparser`先解析HTML页面,然后用`htmlparser-to-html`将解析后的数据还原,以便进一步处理或存储。 2. **模板渲染**:在前端模板引擎中,可以先将HTML模板转换成JSON,...

    HtmlParser的使用

    HTMLParser支持过滤器(Filter)和访问者模式(Visitor),允许用户根据需求选择感兴趣的节点进行处理。例如,如果你想提取所有的链接(a标签),可以创建一个`TagFilter`: ```java import org.htmlparser.filters...

    HTMLParser-2.0-SNAPSHOT-bin.zip JAVA html解析库

    public class HtmlLinkParser { //获取子链接,url为网页url,filter是链接过滤器,返回该页面子链接的HashSet public static Set&lt;String&gt; extracLinks(String url, LinkFilter filter) { ...

    HTMLParser-2.0-API.CHM

    HTMLParser-2.0-API.CHM

    htmlparser学习笔记

    HTMLParser是一个纯Java编写的库,专门用于解析和处理HTML文档。...对于想要深入学习和实践的开发者,访问HTMLParser的中文论坛(http://bbs.hexiao.cn/thread.php?fid=6)可以获取更多的支持和资源。

    htmlparser-1.6p.jar

    "htmlparser-1.6p.jar"是该库的特定版本,用于在Java环境中集成和使用。 HTMLParser的核心功能包括: 1. **标签和属性处理**:它可以识别并解析HTML文档中的各种标签,如`&lt;html&gt;`, `&lt;head&gt;`, `&lt;body&gt;`等,同时处理...

    正则表达式+_HTMLParser使用详解-2010-03-21

    正则表达式与HTMLParser是两种在处理文本数据时非常重要的工具。正则表达式(Regular Expression)是一种模式匹配语言,常用于字符串的查找、替换和提取等操作,而HTMLParser则是用来解析HTML文档结构的工具,尤其在...

    HTMLParser使用文档和jar包

    首先,`HTMLParser-2.0-SNAPSHOT-doc.zip`包含了HTMLParser的使用文档。这份文档通常包含API参考、教程、示例代码和用户指南,是学习和理解HTMLParser的关键资源。通过阅读这份文档,你可以了解到如何初始化解析器,...

    htmlparser-1.2.1 jar

    htmlparser-1.2.1jar包下载htmlparser-1.2.1jar包下载

    htmlparser-c++

    在使用HTMLParser-C++时,开发人员需要包含相关的头文件,如`htmlparser.h`,然后创建解析器实例,例如`HTMLParser parser`。解析器通常会有一个解析HTML字符串或文件的方法,如`parseString`或`parseFile`。解析...

    HTMLParser 使用文档、jar包、以及源码

    2. **HTMLParser-2.0-SNAPSHOT-doc.zip**:这是HTMLParser库的API文档,包含了详细的Javadoc。通过解压并查阅这个文档,开发者可以了解每个类、方法和接口的功能,这对于理解和使用库中的各种功能至关重要。 3. **...

    HtmlParser-2.0 API

    HtmlParser-2.0 API ,chm格式,方便使用

Global site tag (gtag.js) - Google Analytics