一、HTMLParser.net是什么?

HTMLParser.net是HtmlParser的JAVA版本的dot net版本。

二、HTMLParser可以用来做什么?

HtmlParser是用来改造或者提取HTML,通过HtmlParser可以高速,快捷的从Html页面中分离出你想要的内容。

三、HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:
    public Parser ();
    public Parser (Lexer lexer, ParserFeedback fb);
    public Parser (URLConnection connection,ParserFeedbackfb) 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);

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页面中的结束位置
用于Filter过滤的函数:
  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):设置子节点列表
其他函数:
  void doSemanticAction ():执行这个Node对应的操作(只有少数Tag有对应的操作)
  Object clone ():接口Clone的抽象函数


实际我们用HTMLParser最多的是处理HTML页面,Filter或Visitor相关的函数是必须的,然后第一类和第二类函数是用得最多的
AbstractNodes是Node的直接子类,也是一个抽象类。它的三个直接子类实现是RemarkNode,用于保存注释。在输出结果的 toString部分中可以看到有一个"Rem (345[6,2],356[6,13]): 这是注释",就是一个RemarkNode。TextNode也很简单,就是用户可见的文字信息。TagNode是最复杂的,包含了HTML语言中的所有标签,而且可以扩展(扩展 HTMLParser 对自定义标签的处理能力)。TagNode包含两类,一类是简单的Tag,实际就是不能包含其他Tag的标签,只能做叶子节点。另一类是 CompositeTag,就是可以包含其他Tag,是分支节点

HTMLParser遍历了网页的内容以后,以树(森林)结构保存了结果。HTMLParser访问结果内容的方法有两种。使用Filter和使用 Visitor。

(一)Filter类
顾名思义,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类都实现了org.htmlparser.NodeFilter接口。这个接口只有一个主要函数:
boolean accept (Node node);
各个子类分别实现这个函数,用于判断输入的Node是否符合这个Filter的过滤条件,如果符合,返回 true,否则返回false。

下面将以具体的例子来学习htmlparser.net