`
yxgyh
  • 浏览: 274328 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

htmlparser使用(一)

    博客分类:
  • JAVA
阅读更多

需要做一个垂直搜索引擎,比较了nekohtml和htmlparser 的功能,尽管nekohtml在容错性、性能等方面的口碑好像比htmlparser好(htmlunit也用的是nekohtml),但感觉 nekohtml的测试用例和文档都比htmlparser都少,而且htmlparser基本上能够满足垂直搜索引擎页面处理分析的需求,因此先研究一下htmlparser的使用,有空再研究nekohtml和mozilla html parser的使用。    html的功能还是官方说得最为清楚,

HTML Parser is a Java library used to parse HTML in either a linear or nested fashion. Primarily used for transformation or extraction, it features filters, visitors, custom tags and easy to use JavaBeans. It is a fast, robust and well tested package.

Welcome to the homepage of HTMLParser - a super-fast real-time parser for real-world HTML. What has attracted most developers to HTMLParser has been its simplicity in design, speed and ability to handle streaming real-world html.

The two fundamental use-cases that are handled by the parser are extraction and transformation (the syntheses use-case, where HTML pages are created from scratch, is better handled by other tools closer to the source of data). While prior versions concentrated on data extraction from web pages, Version 1.4 of the HTMLParser has substantial improvements in the area of transforming web pages, with simplified tag creation and editing, and verbatim toHtml() method output.

研究的重点还是extraction的使用,有空再研究transformation的使用。
1、htmlparser对html页面处理的数据结构

 


如图所示,HtmlParser采用了经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode和Tag来描述HTML页面各元素。

    * org.htmlparser.Node:

Node接口定义了进行树形结构节点操作的各种典型操作方法,包括:

节点到html文本、text文本的方法:toPlainTextString、toHtml

典型树形结构遍历的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText

获取节点对应的树形结构结构的顶级节点Page对象方法:getPage

获取节点起始位置的方法:getStartPosition、getEndPosition

Visitor方法遍历节点时候方法:accept (NodeVisitor visitor)

Filter方法:collectInto (NodeList list, NodeFilter filter)

Object方法:toString、clone

    * org.htmlparser.nodes.AbstractNode:

AbstractNode是形成HTML树形结构抽象基类,实现了Node接口。

在htmlparser中,Node分成三类:

RemarkNode:代表Html中的注释

TagNode:标签节点。

TextNode:文本节点

这三类节点都继承AbstractNode。

    * org.htmlparser.nodes.TagNode:

TagNode包含了对HTML处理的核心的各个类,是所有TAG的基类,其中有分为包含其他TAG的复合节点ComositeTag和不包含其他TAG的叶子节点Tag。

复合节点CompositeTag:

AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,

HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,

TableHeader,TableRow,TableTag,TextareaTag,TitleTag

叶子节点TAG:

BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,
2、htmlparser对html页面处理的算法

主要是如下几种方式

    * 采用Visitor方式访问Html

    public static void testVisitorAll()
    {
        try
        {
            Parser parser = new Parser();
            parser.setURL("http://www.google.com");
            parser.setEncoding(parser.getEncoding());
            NodeVisitor visitor = new NodeVisitor()
            {
                public void visitTag(Tag tag)
                {
                    logger.info("testVisitorAll() Tag name is :" + tag.getTagName() + " Class is :" + tag.getClass());
                }

            };
            parser.visitAllNodesWith(visitor);
        } catch (ParserException e)
        {
            e.printStackTrace();
        }
    }

    * 采用Filter方式访问html

    public static void testLinkTag()
    {
        try
        {
            NodeFilter filter = new NodeClassFilter(LinkTag.class);
            Parser parser = new Parser();
            parser.setURL("http://www.google.com");
            parser.setEncoding(parser.getEncoding());
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for (int i = 0; i < list.size(); i++)
            {
                LinkTag node = (LinkTag) list.elementAt(i);
                logger.fatal("testLinkTag() Link is :" + node.extractLink());
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    * 采用org.htmlparser.beans方式

    public static void testLinkBean()
    {
        Parser parser = new Parser();

        LinkBean linkBean = new LinkBean();
        linkBean.setURL("http://www.google.com");
        URL[] urls = linkBean.getLinks();

        for (int i = 0; i < urls.length; i++)
        {
            URL url = urls[i];
            logger.fatal("testLinkBean() -url is :" + url);
        }
    }

    * parse (NodeFilter filter):通过NodeFilter方式获取
    * visitAllNodesWith (NodeVisitor visitor):通过Nodevisitor方式
    * extractAllNodesThatMatch (NodeFilter filter):通过NodeFilter方式

3.2、org.htmlparser.beans

对Visitor和Filter的方法进行了封装,定义了针对一些常用html元素操作的bean,简化对常用元素的提取操作。

包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。
3.3、org.htmlparser.nodes

定义了基础的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。
3.4、org.htmlparser.tags

定义了htmlparser的各种tag。
3.5、org.htmlparser.filters

定义了htmlparser所提供的各种filter,主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面指定类型的元素进行过滤,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter
3.6、org.htmlparser.visitors

定义了htmlparser所提供的各种visitor,主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor
3.7、org.htmlparser.parserapplications

定义了一些实用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,这几个类也可以作为htmlparser使用样例。
3.8、org.htmlparser.tests

对各种功能的单元测试用例,也可以作为htmlparser使用的样例。

 

分享到:
评论

相关推荐

    HTMLParser 使用举例

    下面是一个简单的 HTMLParser 使用举例: ```java package com.amigo.htmlparser; import java.io.*; import java.net.URL; import java.net.URLConnection; import org.htmlparser.filters.*; import org....

    HTMLParser使用文档和jar包

    本篇将详细阐述HTMLParser的使用方法、功能以及提供的相关资源。 首先,`HTMLParser-2.0-SNAPSHOT-doc.zip`包含了HTMLParser的使用文档。这份文档通常包含API参考、教程、示例代码和用户指南,是学习和理解...

    JAVA htmlparser 使用实例

    本文将通过一个具体的例子来详细介绍如何在Java中使用`HtmlParser`库进行HTML文档的解析。 #### 示例背景 假设我们正在开发一款Android应用,该应用需要从HTML文件中提取特定的数据。这里我们将使用`HtmlParser`库...

    C# HtmlParser使用小实例

    总的来说,`C# HtmlParser使用小实例`为我们提供了一个学习和实践HTML解析的起点。通过阅读提供的`C# HtmlParser使用实例.doc`文档,你可以深入了解如何利用这个库来满足你的具体需求。同时,`winsta.Htmlparser.chm...

    HTMLParser.net源代码HTMLParser.net使用demo

    本项目名为"HTMLParser.net源代码HTMLParser.net使用demo",显然是一个包含示例代码的压缩包,用于展示如何在实际应用中使用HTMLParser.net。 HTMLParser.net的核心功能包括: 1. **HTML解析**:它能够将HTML字符...

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

    1. **例子.txt**:这是一个包含使用HTMLParser库的实际示例代码的文本文件。开发者可以通过阅读和运行这些示例来快速理解如何在自己的项目中应用HTMLParser。 2. **HTMLParser-2.0-SNAPSHOT-doc.zip**:这是...

    网络爬虫 HTMLParser 使用指南

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

    HTMLParser使用详解

    在本文中,我们将深入探讨HTMLParser的使用,包括其核心类`Parser`以及如何初始化和使用它。 首先,`Parser`是HTMLParser库的核心组件,它负责解析HTML页面。`Parser`类提供了多个构造函数,以适应不同的初始化需求...

    htmlparser 使用指南 入门 必读htmlparser 使用指南 入门 必读htmlparser 使用指南 入门 必读

    虽然在某些方面,如容错性和性能,NekoHTML可能更胜一筹,并且被HTMLUnit所采用,但HTMLParser的文档和测试用例相对更丰富,对于构建垂直搜索引擎的页面处理和分析需求,HTMLParser是一个不错的选择。 HTMLParser的...

    htmlparser的jar包

    在实际开发中,使用HTMLParser时,你可能需要处理一些常见的问题,比如CSS选择器的支持、JavaScript的解析、URL的处理等。虽然HTMLParser本身并不直接提供这些功能,但可以通过扩展其API或者与其他库(如Jsoup)结合...

    Java正则表达式入门 + HTMLParser使用详解

    除了正则表达式,本话题还提到了HTMLParser的使用。HTMLParser是一个Java库,用于解析HTML文档,提取或修改数据。它可以处理HTML标签、属性、文本等内容,对网页内容进行分析和操作。使用HTMLParser,开发者可以方便...

    htmlparser.jar文件

    HTMLParser提供了多种方法来访问和操作解析树,比如`parseContent()`用于获取整个文档的节点列表,`visitAllNodesWith()`可以遍历所有节点并应用自定义的访问器,`getFirstNodeWithTag()`用于找到第一个特定标签的...

    HTMLParser使用详解.doc

    以下是一个简单的示例,展示了如何使用 HTMLParser 从文件或 URL 中读取 HTML 并进行解析: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser.util....

    c#版htmlparser htmlparser.dll htmlparser源代码

    `htmlparser.dll`是这个库的动态链接库文件,它包含了编译好的类和方法,可以直接在C#项目中引用以使用HTMLParser的功能。在C#项目中,我们可以通过添加对dll的引用来调用库中的方法,比如解析HTML字符串、查找特定...

    HtmlParser

    使用HTMLParser,我们可以解析网页内容,提取所需信息,如文章标题、链接、图片等。以下是一些核心概念和步骤: 1. **创建自定义解析器**: 首先,我们需要继承Python的`HTMLParser`类,并重写其方法,如`handle_...

    htmlparser网页分析

    9. 结合其他工具:HTMLParser可以与其他工具结合使用,如Jsoup,后者是一个更现代的HTML解析库,提供更友好的API和更强的CSS选择器支持。两者结合可以提高处理复杂HTML文档的效率。 10. 性能考虑:虽然HTMLParser...

    htmlparser库与教程

    "htmlparser实现从网页上抓取数据.doc"文件则很可能是一个详细的教程,指导用户如何利用HTMLParser库进行网页数据抓取。在这个教程中,可能会涵盖以下关键知识点: 1. **安装和引入HTMLParser**:首先,用户需要将...

    htmlparser

    htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或  提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0。  毫不夸张地说,htmlparser就是目前最好...

    解析htmlparser的所有jar包

    5. **兼容性与扩展性**:HTMLParser与其他Java库兼容良好,如JDOM、DOM4J等,可以方便地与其他XML处理工具结合使用。此外,它的API设计使得扩展功能相对简单。 6. **错误处理**:HTMLParser具有一定的容错能力,...

Global site tag (gtag.js) - Google Analytics