首页 > 代码库 > HtmlParser学习之一:基础内容

HtmlParser学习之一:基础内容


1、相关资料

官方文档:http://htmlparser.sourceforge.net/samples.html

API:http://htmlparser.sourceforge.net/javadoc/index.html

其它HTML 解释器:jsoup等。由于HtmlParser自2006年以后就再没更新,目前很多人推荐使用jsoup代替它。


2、使用HtmlPaser的关键步骤

(1)通过Parser类创建一个解释器

(2)通过Filter或者Vistor访问Html中的内容。


3、使用Parser的构造函数创建解释器

Parser() 
          Zero argument constructor.
Parser(Lexer lexer) 
          Construct a parser using the provided lexer.
Parser(Lexer lexer, ParserFeedback fb) 
          Construct a parser using the provided lexer and feedback object.
Parser(String resource) 
          Creates a Parser object with the location of the resource (URL or file).
Parser(String resource, ParserFeedback feedback) 
          Creates a Parser object with the location of the resource (URL or file) You would typically create a DefaultHTMLParserFeedback object and pass it in.
Parser(URLConnection connection) 
          Construct a parser using the provided URLConnection.
Parser(URLConnection connection, ParserFeedback fb) 
          Constructor for custom HTTP access.
        对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。
        这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。对于大多数中文页面来说,好像这是应该用得比较多的一个方法。


4、HtmlPaser使用Node对象保存各节点信息


(1)访问各个节点的方法
Node getParent ():取得父节点
NodeList getChildren ():取得子节点的列表
Node getFirstChild ():取得第一个子节点
Node getLastChild ():取得最后一个子节点
Node getPreviousSibling ():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)
Node getNextSibling ():取得下一个兄弟节点
(2)取得Node内容的函数
String getText ():取得文本
String toPlainTextString():取得纯文本信息。
String toHtml () :取得HTML信息(原始HTML
String toHtml (boolean verbatim):取得HTML信息(原始HTML
String toString ():取得字符串信息(原始HTML
Page getPage ():取得这个Node对应的Page对象
int getStartPosition ():取得这个NodeHTML页面中的起始位置
int getEndPosition ():取得这个NodeHTML页面中的结束位置


5、使用Filter访问Node节点及其内容

(1)Filter的种类

顾名思义,Filter就是对于结果进行过滤,取得需要的内容。

所有的Filter均实现了NodeFilter接口,此接口只有一个方法Boolean accept(Node node),用于确定某个节点是否属于此Filter过滤的范围。

HTMLParser在org.htmlparser.filters包之内一共定义了16个不同的Filter,也可以分为几类。
判断类Filter
TagNameFilter
HasAttributeFilter

HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
逻辑运算Filter
AndFilter
NotFilter

OrFilter
XorFilter
其他Filter
NodeClassFilter
StringFilter

LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter

除此以外,可以自定义一些Filter,用于完成特殊需求的过滤。
(2)Filter的使用示例