htmlParse 学习小结
    htmlparser是个优秀的网页信息抓取工具,下面小结其一些基本的用法: 
1 创建parser对象,有两种方式 
? Parser parser=new Parser(String html) 
? 传入的html 
? 第2种为: 
?? //通过指定URLConnection对象创建Parser对象 
? Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection()); 
之后就可以进行访问parser中解析好的内容了 
2 解析时,有两类方式,visitor方式和filter过滤方式,vistior方式需要遍历每一个节点, 
而filter方式则是过滤。 
3 visitor方式的例子; 
?? try{ 
//通过指定URLConnection对象创建Parser对象 
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection()); 
//设置Parser对象的字符编码,一般与网页的字符编码保持一致 
??????? parser.setEncoding("GB2312"); 
??????? //创建LinkFindingVisitor对象 
??????? LinkFindingVisitor lvisitor = new LinkFindingVisitor("http://news.qq.com/"); 
??????? //查找http://www.qq.com的链接个数 
??????? parser.visitAllNodesWith(lvisitor); 
??????? System.out.println("网页中包含http://news.qq.com/的链接个数:"+lvisitor.getCount()); 
}catch(Exception ex){ 
ex.printStackTrace(); 
} 
????? /** TextExtractingVisitor类的用法举例 */ 
public static void testTextExtractingVisitor(String url){ 
try{ 
//通过指定URLConnection对象创建Parser对象 
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection()); 
//设置Parser对象的字符编码,一般与网页的字符编码保持一致 
??????? parser.setEncoding("GB2312"); 
??????? //创建StringFindingVisitor对象 
??????? TextExtractingVisitor visitor = new TextExtractingVisitor(); 
??????? //去除网页中的所有标签,提出纯文本内容 
??????? parser.visitAllNodesWith(visitor); 
??????? System.out.println("网页的纯文本内容为:"+visitor.getExtractedText()); 
}catch(Exception ex){ 
ex.printStackTrace(); 
} 
} 
4 还可以自定义nodevisitor来扩展nodevisitor,重载其中的各方法: 
? /** 自定义NodeVisitor子类,并重载抽象类NodeVisitor中的相关方法 */ 
public class MyNodeVisitor extends NodeVisitor { 
/** 重载抽象类NodeVisitor的beginParsing方法,解析开始时调用此方法 */ 
public void beginParsing(){ 
System.out.println("开始解析HTML内容......"); 
} 
/** 重载抽象类NodeVisitor的finishedParsing方法,解析结束时调用此方法 */ 
public void finishedParsing(){ 
System.out.println("整个HTML内容解析完毕!"); 
} 
/** 重载抽象类NodeVisitor的visitTag方法,遇到开始标签时调用此方法 */ 
public void visitTag(Tag tag){ 
System.out.println("开始当前标签: "+tag.getText()); 
} 
/** 重载抽象类NodeVisitor的visitEndTag方法,遇到结束标签时调用此方法 */ 
public void visitEndTag(Tag tag){ 
System.out.println("结束当前标签: "+tag.getText()); 
} 
/** 重载抽象类NodeVisitor的visitStringNode方法,遇到文本节点时调用此方法 */ 
public void visitStringNode(Text string){ 
System.out.println("当前文本节点: "+string); 
} 
/** 重载抽象类NodeVisitor的visitRemarkNode方法,遇到注释时调用此方法 */ 
public void visitRemarkNode(Remark remark){ 
System.out.println("当前注释: "+remark); 
} 
5 使用filter方式过滤 
? 基本用法: 
?? TagNameFilter类用法 
?? //通过指定URLConnection对象创建Parser对象 
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection()); 
??????? //设置Parser对象的字符编码,一般与网页的字符编码保持一致 
parser.setEncoding("GB2312"); 
??????????? //创建TagNameFilter实例 
??????????? NodeFilter filter = new TagNameFilter ("DIV"); 
??????????? //筛选出所有DIV标签节点 
??????????? NodeList nodes = parser.extractAllNodesThatMatch(filter); 
??????????? if(nodes!=null) { 
??????????????? for (int i = 0; i < nodes.size(); i++) { 
??????????????????? Node textnode = (Node) nodes.elementAt(i);??????????????????? 
??????????????????? System.out.println("当前DIV:"+textnode.getText()); 
??????????????? } 
?? AndFilter类用法 
??? //通过指定URLConnection对象创建Parser对象 
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection()); 
??????? //设置Parser对象的字符编码,一般与网页的字符编码保持一致 
parser.setEncoding("GB2312"); 
??????????? //创建HasAttributeFilter实例 
??????? NodeFilter filter1 = new HasAttributeFilter("id"); 
??????? //创建TagNameFilter实例 
??????? NodeFilter innerFilter = new TagNameFilter ("DIV"); 
??????? //创建HasChildFilter实例 
??????? NodeFilter filter2 = new HasChildFilter(innerFilter); 
???????