一:简介
(1)HTML Parser是一个用于解析Html的Java的库,可采用线性或嵌套两种方式。主要用于网页的转换或提取,他有一些特性:过滤器filter,遍历器visitors,通常的标签tagName和易用的JavaBeans。它是一个快速,健壮,并严格测试过的组件。
(2)个人理解:HTMLParser遍历了网页的内容以后,以树(森林)结构保存了结果,各个节点代表HTML中的标签和属性值,非常类似于XML解析器解析后的结果,也类似与html dom的结构;HTMLParser访问结果内容的方法有两种:使用Filter和使用Visitor,一般Filter用的多一些,用于提取特定的网页信息。
(3)官方API说明 ?? (需要Google的)
二:主要函数功能说明:
(1)HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:
?public?Parser?();
????public?Parser?(Lexer?lexer,?ParserFeedback?fb);
???public?Parser?(URLConnection?connection,?ParserFeedback?fb)?throws?ParserException;
????public?Parser?(String?resource,?ParserFeedback?feedback)?throws?ParserException;
???public?Parser?(String?resource)?throws?ParserException;
????public?Parser?(Lexer?lexer);
????public?Parser?(URLConnection?connection)?throws?ParserException;
????和一个静态类?public?static?Parser?createParser?(String?html,?String?charset);
(2)HTMLParser将解析过的信息保存为一个树的结构。Node是信息保存的数据类型基础。
请看Node的定义:
public?interface?Node?extends?Cloneable;
Node中包含的方法有几类:
对于树型结构进行遍历的函数,这些函数最容易理解:
Node?getParent?():取得父节点
NodeList?getChildren?():取得子节点的列表
Node?getFirstChild?():取得第一个子节点
Node?getLastChild?():取得最后一个子节点
Node?getPreviousSibling?():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)
Node?getNextSibling?():取得下一个兄弟节点
取得Node内容的函数:
String?getText?():取得文本
String?toPlainTextString():取得纯文本信息。
String?toHtml?()?:取得HTML信息(原始HTML)
String?toHtml?(boolean?verbatim):取得HTML信息(原始HTML)
String?toString?():取得字符串信息(原始HTML)
Page?getPage?():取得这个Node对应的Page对象
int?getStartPosition?():取得这个Node在HTML页面中的起始位置
int?getEndPosition?():取得这个Node在HTML页面中的结束位置
(3)其它函数:
void?collectInto?(NodeList?list,?NodeFilter?filter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。
用于Visitor遍历的函数:
void?accept?(NodeVisitor?visitor):对这个Node应用visitor
用于修改内容的函数,这类用得比较少:
void?setPage?(Page?page):设置这个Node对应的Page对象
void?setText?(String?text):设置文本
void?setChildren?(NodeList?children):设置子节点列表
(4)用于Filter过滤的函数
顾名思义,Filter就是对于结果进行过滤,取得需要的内容。HTMLParser在org.htmlparser.filters包之内一共定义了16个不同的Filter,也可以分为几类。
判断类Filter:
TagNameFilter ? ----- html标签指定指定过滤器
HasAttributeFilter ?------ ?属性和属性值指定过滤器
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
逻辑运算Filter:
AndFilter ?------ 同时满足两个或多个过滤条件的过滤器
NotFilter ? ------ ?非
OrFilter ? ?------- ?或
XorFilter
其他Filter:
NodeClassFilter
StringFilter ? ------- ?过滤敏感信息的过滤器
LinkStringFilter ?--------- 过滤敏感链接信息的过滤器
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
所有的Filter类都实现了org.htmlparser.NodeFilter接口。这个接口只有一个主要函数:
boolean accept (Node node);
各个子类分别实现这个函数,用于判断输入的Node是否符合这个Filter的过滤条件,如果符合,返回true,否则返回false。
三:html结构解析图示说明
(1)html代码
<html>
<head>
<title>HTML DOM</title>
</head>
<body>
<h1>DOM的结构</h1>
<p><a href="href">链接</a></p>
</body>
</html>
(2)html的dom结构(即parser后的解析树形结构)

(3)说明
- 由结构图中我们可以看到,整个文档就是一个文档节点。
- 而每一个HMTL标签都是一个元素节点。
- 标签中的文字则是文字节点。
- 标签的属性是属性节点。
- 一切都是节点……
总之,节点树的概念从图中一目了然,最上面的就是“树根”了。节点之间有父子关系,祖先与子孙关系,兄妹关系。这些关系从图中也很好看出来,直接连线的就是父子关系了。而有一个父亲的就是兄妹关系……更多dom详见W3C