`

使用HTMLparser解析HTML

 
阅读更多

http://express.ruanko.com/ruanko-express_44/technologyexchange6.html

htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。Htmlparser相对于其他html解析工具有较好的优势,它能超高速解析html,而且不会出错。

我用一段代码简单介绍htmlparser的运用方法。

public Node[] getNodes(String htmls, String tagTyp, String charset) {
		Parser parser = Parser.createParser(htmls, charset);
		NodeFilter filter = new TagNameFilter(tagTyp); 
		NodeList nodeList;
		try {
			nodeList = parser.parse(filter);
			return nodeList.toNodeArray();
		} catch (ParserException e) {
			e.printStackTrace();
		}
	}

首先使用流将html内容读取出来,放入解析对象中并设置字符编码,这里我解析的是三大大型招聘网的简历数据,由于每个网站的简历编码方式不同,所以在解析内容的时候需要指定不同的字符编码,而且指定编码集的时候只有通过查找三大网站文件<head></head>中的内容不同而指定字符编码,这是一个让人比较头痛的问题。

代码中的filter对象主要用来过滤标签获取标签中的内容,如:将tagtyp参数替换成<table>那么它会将文件中所有<table></table>中的文本内容获取出来,接下来要做的只要遍历节点集合就可以了。如果节点中还有节点,可以继续更深一层过滤。Htmlparser的主要作用也就在这里。而真正在我的项目中仅仅依靠过滤来达到想要的效果还是有一定距离的,每个html文件的布局不同,解析的流程也就不同,所以不能像一般程序那样方法复用(这里我说的是获取真正想要的内容时,过滤标签的代码还是可以复用的)。而真正获取想要文件内容时还得需要使用关键字匹配的方式来实现。虽然操作比较麻烦,但毕竟可以达到想要的效果。

Htmlparser对html文件的解析处理结构

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

org.htmlparser.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, 

htmlparser对html页面处理的算法

主要是如下几种方式:

采用Visitor方式访问Html

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.fatal(”testVisitorAll() Tag name is :”
                    + tag.getTagName() + ” \n Class is :”
                    + tag.getClass());
        }
    };
parser.visitAllNodesWith(visitor);
} catch (ParserException e) {
    e.printStackTrace();
}

采用Filter方式访问html

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方式

另外htmlparser 还在org.htmlparser.beans中对一些常用的方法进行了封装,以简化操作,例如:

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);
}

htmlparser关键包结构说明

htmlparser其实核心代码并不多,好好研究一下其代码,弥补文档不足的问题。同时htmlparser的代码注释和单元测试用例还是很齐全的,也有助于了解htmlparser的用法。

org.htmlparser

定义了htmlparser的一些基础类。其中最为重要的是Parser类。

Parser是htmlparser的最核心的类,其构造函数提供了如下:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)。

各构造函数的具体用法及含义可以查看其代码,很容易理解。

Parser常用的几个方法:

elements获取元素

Parser parser = new Parser (”http://www.google.com”);
    for (NodeIterator i = parser.elements (); i.hasMoreElements (); )
    processMyNodes (i.nextNode ());
  • parse (NodeFilter filter):通过NodeFilter方式获取
  • visitAllNodesWith (NodeVisitor visitor):通过Nodevisitor方式
  • extractAllNodesThatMatch (NodeFilter filter):通过NodeFilter方式

org.htmlparser.beans

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

包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。

org.htmlparser.nodes

定义了基础的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。

org.htmlparser.tags

定义了htmlparser的各种tag。

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。

org.htmlparser.visitors

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

org.htmlparser.parserapplications

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

org.htmlparser.tests

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

分享到:
评论

相关推荐

    Python中使用HTMLParser解析html实例

    主要介绍了Python中使用HTMLParser解析html实例,本文直接给出使用示例,并总结出HTMLParser含有的方法分为两类,一类是需要显式调用的,而另一类不需显示调用,需要的朋友可以参考下

    htmlparser的jar包

    之后,通过`import`语句引入所需的类,就可以开始使用HTMLParser解析HTML文档了。 总的来说,HTMLParser是一个强大且灵活的工具,适用于需要解析和操作HTML的Java应用,如爬虫、数据提取、网页自动化等场景。通过...

    基于Java的源码-HTML文档解析器 HTMLParser.zip

    例如,以下是一个简单的使用HTMLParser解析HTML并打印所有`&lt;a&gt;`标签的例子: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser.nodes.TagNode; public ...

    使用HtmlParser

    《使用HtmlParser解析HTML网页内容》 在信息技术领域,HTML(HyperText Markup Language)是用于构建和呈现网页的标准标记语言。然而,对于开发者而言,直接处理HTML文本有时是一项挑战,尤其是当需要从中提取特定...

    html.rar_htmlparser_java parsing html

    接下来,让我们通过一个简单的示例来了解如何使用HTMLParser解析HTML文档。假设我们有一个HTML文件,名为`index.html`,包含以下内容: ```html &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;title&gt;Example Page &lt;h1&gt;Hello, World...

    htmlparser解析html分页

    HTMLParser是一个用于解析HTML文档的库,尤其在处理非结构化或不标准的HTML时非常有用。这个库可能被用于从网页中提取数据,比如在爬虫项目中,或者进行自动化测试时解析页面内容。本篇文章将深入探讨HTMLParser的...

    htmlparser解析Html的jar包和源文件包(两个)

    HTMLParser是一款专为Java开发人员设计的开源库,用于解析HTML文档。这个工具包小巧而强大,能够处理不规则的HTML结构,对于处理网络爬虫、网页数据提取或需要解析HTML内容的应用程序来说,是非常实用的。在提供的...

    在Python中使用HTMLParser解析HTML的教程

    如果我们要编写一个搜索引擎,第...好在Python提供了HTMLParser来非常方便地解析HTML,只需简单几行代码: from HTMLParser import HTMLParser from htmlentitydefs import name2codepoint class MyHTMLParser(HTMLPa

    htmlparser(HTML页面解析)例子

    在本例中,我们将深入探讨如何使用HTMLParser库解析HTML页面,提取所需信息。 首先,我们需要导入Python的`HTMLParser`模块。在Python 3中,这个模块已经被重命名为`html.parser`,因此应该导入`html.parser`,而...

    Java中解析html的开源项目04

    接下来,我们可以创建一个简单的例子来展示如何使用HTMLParser解析HTML: 1. DOM解析示例: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeList; import org.htmlparser.util....

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

    例如,以下是一个简单的使用示例,展示如何使用HTMLParser解析一个HTML字符串并打印出所有的`&lt;a&gt;`标签: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeIterator; import org.htmlparser....

    使用 HttpClient 和 HtmlParser 实现简易爬虫

    使用HtmlParser解析HTML文档,可以通过创建`HtmlParser`对象并调用其`parse`方法完成。 2. **提取所需信息:** 通过HtmlParser提供的各种过滤器和访问者模式,可以从解析后的HTML文档中抽取所需的信息。 3. **...

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

    使用HTMLPARSER解析HTML内容。首先,创建一个ParserDelegator对象,然后调用parse方法,传入HTML内容和一个Handler。Handler是自定义的接口实现,用于处理解析过程中遇到的每个HTML元素。 6. **提取数据**: 在...

    htmlparser.jar.zip

    例如,以下是一个简单的使用HTMLParser解析HTML并提取所有链接的例子: ```java import org.htmlparser.Parser; import org.htmlparser.util.NodeList; import org.htmlparser.util.NodeIterator; public class ...

    使用HTMLParser解析网页,找出文章后下载保存

    总结来说,使用HTMLParser解析网页涉及到以下步骤: 1. 继承`HTMLParser`并重写相关方法以定义解析逻辑。 2. 找到文章内容所在的标签,如`&lt;p&gt;`或`&lt;article&gt;`,并在适当的方法中处理它们。 3. 收集文章文本,并在适当...

    HTMLParser的使用

    以下是一个简单的使用HTMLParser解析HTML页面的Java代码示例: ```java import org.htmlparser.*; import org.htmlparser.filters.*; import org.htmlparser.nodes.*; import org.htmlparser.tags.*; import org....

    Html解析助手htmlparser.jar

    3. **解析HTML**:调用解析器的`parse`方法,传入HTML源码或输入流,开始解析过程。 4. **处理解析事件**:注册事件处理器,当解析到特定元素时执行相应的代码逻辑。 5. **获取结果**:解析完成后,可以遍历解析树,...

    Java正则表达式详解+基于HTMLParser解析HTML网页

    如何在Java程序中利用正则表达式实现对字符串的解析.另外,HTMLParser是一款很强大的对HTML网页进行解析的工具,其中大量地用到正则表达式.

Global site tag (gtag.js) - Google Analytics