`
jansener
  • 浏览: 50732 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

HTMLParser的两种使用

阅读更多
一,数据组织分析:
HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remark和Text相对简单,此处就将其忽略了。

Node是形成树结构表示HTML的基础,所有的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法,定义了Visitor访问机制。
AbstractNode是Node的一种具体的类实现,起到构成树形结构的作用,除了同具体Node相关的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode实现了大多基本的方法,使得它的子类,不用理会具体的树操作。
Tag是具体分析的主要内容。Tag分成composite的Tag和不能包含其他Tag的简单Tag两类,其中前者的基类是CompositeTag,其子类包含BodyTag,Div,FrameSetTag,OptionTag,等27个子类;而简单Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag这八类。
Node分成三类:

RemarkNode:代表Html中的注释
TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。
TextNode:文本节点

二,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:用来修改网页中的链接。
四,Filter

如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。所以说要想用HtmlParser,首先要熟悉上面讲到的数据组织。

系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。

Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:
NodeList nodeList = myParser.parse(someFilter);
解析之后,我们可以采用:
Node[] nodes = nodeList.toNodeArray();
来获取节点数组,也可以直接访问:
Node node = nodeList.elementAt(i)来获取Node。

另外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的extractAllNodesThatMatch(someFilter)来进一步过滤,同时又可以用NodeList的isitAllNodesWith(someVisitor)来做进一步的访问。
这样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不同的应用可以采用visitor来遍历Html节点提取数据,也可以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。

代码:
package com.eric.Html.htmlparser;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.HasChildFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.TextExtractingVisitor;

/** *//**
* @author 作者 Eric yang E-mail:yjboy1982@126.com
* @version 创建时间:2007-7-16 下午02:49:55
* 类说明
*/
public class AstroExtractorTest ...{

    /** *//**
     * @param args
     * @throws ParserException
     */
    public static void main(String[] args) throws ParserException ...{
        // TODO Auto-generated method stub
        String title ;
        String constellation ;
        String body ;
        String summary ;
       
        Parser parser = new Parser("http://astro.sina.com.cn/sagittarius.html");
        parser.setEncoding("GB2312") ;
       
        NodeFilter filter_constellation_summart = new AndFilter((new TagNameFilter("td")),(new HasChildFilter(new TagNameFilter("b")))) ;
       
        NodeFilter filter_title = new AndFilter(new TagNameFilter("font"), new HasAttributeFilter("class", "f1491")) ;
       
        NodeFilter filter_body = new AndFilter( new TagNameFilter("td"), new HasAttributeFilter("width", "30%")) ;
       
        NodeList nodelist = parser.parse(filter_constellation_summart) ;
        Node node_constellation = nodelist.elementAt(0) ;       
        constellation = node_constellation.getFirstChild().getNextSibling().toHtml() ;
           
        Node node_summary = nodelist.elementAt(1) ;
        NodeList summary_nodelist = node_summary.getChildren() ;
        summary = summary_nodelist.elementAt(3).toHtml()+summary_nodelist.elementAt(5).toHtml()  ;
       
        parser.reset() ;
       
        nodelist = parser.parse(filter_title) ;
        Node node_title = nodelist.elementAt(0) ;
        title = node_title.getNextSibling().getNextSibling().toHtml() ;
        //title = node_title.getNextSibling().getNextSibling().toHtml() ;
       
        parser.reset() ;
       
        nodelist = parser.parse(filter_body) ;
        Node node_body = nodelist.elementAt(0) ;
        Parser body_parser = new Parser(node_body.toHtml()) ;
        TextExtractingVisitor visitor = new TextExtractingVisitor() ;
        body_parser.visitAllNodesWith(visitor) ;
        body = visitor.getExtractedText() ;
       
        //System.out.println(node_summary.getChildren().toHtml()) ;
        //System.out.println(node_body.toHtml()) ;
        //System.out.println(title.trim()) ;
        //System.out.println(constellation.trim()) ;
        //System.out.println(body.trim()) ;
        System.out.println(summary.trim()) ;
       
    }

}
分享到:
评论

相关推荐

    HTMLParser 使用举例

    它有两种主要使用方式:extraction 和 transformation。前者用于从网页中萃取出需要的内容,后者用于把 Web 页面中的内容转换为需要的格式。 Extraction(萃取)是一种常见的使用方式,例如: * 文本萃取:从网页...

    htmlparser的jar包

    HTMLParser提供了两种主要的解析方式:事件驱动和DOM(Document Object Model)模型。这两个jar包——htmlparser.jar和htmllexer.jar,包含了实现这些功能所需的类和方法。 htmlparser.jar是核心库,它包含了...

    HtmlParser 2.1 码源

    HtmlParser提供了两种主要的解析器模式:`SAX-like`(类似SAX的)和`DOM-like`(类似DOM的)。SAX-like模式逐个事件处理,适合处理大型文档,内存占用低;DOM-like模式则将整个HTML结构加载到内存中,便于遍历和...

    Winista.Htmlparser.Net 源码 +Demo

    开发者可以打开`AnalyzeHtml.sln`,编译并运行这两个项目,以了解HtmlParser的具体使用方法和实际效果。 四、应用实例 HtmlParser在多种场景下都有广泛的应用: 1. **数据抓取**:从网页中抓取特定信息,如产品...

    使用 HttpClient 和 HtmlParser 实现简易网络爬虫

    它提供了线性和嵌套两种解析模式,便于进行网页转换和内容抽取。HtmlParser的特点包括过滤器、访问者模式、处理自定义标签以及使用JavaBeans的便利性。这个库被设计得既快速又健壮,适用于处理互联网上的实际网页。...

    网络爬虫 HTMLParser 使用指南

    在HTMLParser中设置页面编码的方式有两种:一种是使用Lexer,另一种是使用静态方法createParser。由于Lexer是一个高级功能,对于大多数中文页面来说,常用的方法是使用静态方法createParser来设置编码。 6. 示例...

    htmlparser(c#,java)

    HTMLParser是一款强大的库,用于解析HTML文档,它提供了C#和Java两种编程语言的实现,使得开发者在处理HTML内容时有了更多的灵活性。本文将深入探讨HTMLParser的核心功能、使用场景、以及如何在C#和Java中集成和使用...

    HtmlParser源码及其jar包

    HTMLParser提供了三种主要的操作方式来处理HTML内容: 1. **事件驱动解析**:通过注册事件处理器,当HTML解析器遇到特定的HTML标签或元素时,会触发相应的事件。例如,当解析到`&lt;div&gt;`标签时,可以调用预先定义的...

    Java使用HtmlParser实现简单的网络爬虫.zip

    HtmlParser提供了两种解析模式:SAX(简单API for XML)和DOM。SAX模式适合处理大文件,因为它不需要一次性加载整个文档;DOM模式则更直观,允许开发者通过遍历树形结构来查找元素。对于简单的爬虫,DOM模式可能更为...

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

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

    用C#实现HtmlParser的代码

    该篇文章主要介绍了用C#实现HtmlParser的两种方法,分别是使用System.Net.WebClient下载网页并使用正则表达式来分析Html内容,以及使用Winista.Htmlparser.Net解析Html。下面我们将详细介绍这两种方法。 第一种方法...

    HtmlParser学习笔记-- htmlparser简介

    Tag分为两种类型:CompositeTag和简单Tag。CompositeTag可以包含其他Tag,例如BodyTag、Div、FrameSetTag等,它们代表可以嵌套其他元素的HTML标签。简单Tag则不能包含其他Tag,如BaseHrefTag、DoctypeTag、FrameTag...

    htmlparser

    2. **解析过程**:HTMLParser的工作原理通常包括两个主要步骤:词法分析和语法分析。词法分析将HTML源代码拆分为一系列的令牌(tokens),如标签、属性、文本等。语法分析则根据HTML语法规则将这些令牌构建为DOM...

    使用_HttpClient_和_HtmlParser_实现简易爬虫

    - 提供了两种解析模式:线性和嵌套。 - 支持HTML文档的转换和内容抽取。 - 内置过滤器(Filter)和访问者模式(Visitor),便于用户根据需求定制解析逻辑。 - 能够处理各种非标准的HTML代码,提高了兼容性和鲁棒性。 - ...

    HtmlParser 网页分解dll

    在提供的压缩包中,有两个文件:Winista.HtmlParser.dll和ICSharpCode.SharpZipLib.dll。Winista.HtmlParser.dll是HtmlParser库的实现,包含了上述功能的类和方法。而ICSharpCode.SharpZipLib.dll则是一个开源的.NET...

    HTMLParser

    1. **DOMCore.dcu** 和 **DOMCore.pas**:这两个文件是关于 Document Object Model (DOM) 的核心实现。DOM 是一种标准,用于表示 HTML 或 XML 文档的树形结构,允许程序员和脚本语言通过对象接口来访问和操作文档...

    使用HTMLPARSER和HTTPCLIENT制作网络爬虫,附赠相关技术文档。

    HTMLPARSER和HTTPCLIENT是两种常用的工具,常用于制作网络爬虫。HTMLPARSER是一个Java库,用于解析HTML文档,而HTTPCLIENT则是一个用于执行HTTP请求的库,这两个工具结合使用,可以有效地抓取和处理网页数据。 首先...

Global site tag (gtag.js) - Google Analytics