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);
//建立AndFilter執行個體
NodeFilter filter = new AndFilter(filter1, filter2);
//篩選出所有具有id屬性且擁有子節點的所有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());
}
}
StringFilter類用法:
//通過指定URLConnection對象建立Parser對象
Parser parser = new Parser((HttpURLConnection)(new URL(url)).openConnection());
//設定Parser對象的字元編碼,一般與網頁的字元編碼保持一致
parser.setEncoding("GB2312");
//建立StringFilter執行個體
NodeFilter filter = new StringFilter("陳水扁");
//篩選出所有包含"陳水扁"字串的所有文本節點
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("包含\"陳水扁\"字串的文本節點:"+textnode.getText());
}
}