日期:2014-05-17  浏览次数:20607 次

HtmlParser学习系列 -- 学习总结

引入主要包

? ?htmlparser.jar

?

?

解析HtmlParser的主要步骤:

? ? 解析出html中url

?

?

//		Parser parser = new Parser( (HttpURLConnection) (new URL("http://www.google.com")).openConnection() );

		Parser parser = new Parser();     
		parser.setEncoding(parser.getEncoding());     
		parser.setURL("http://www.google.com"); 
		NodeFilter filter = new NodeClassFilter(LinkTag.class);     
		NodeList list = parser.extractAllNodesThatMatch(filter);     
		for (int i = 0; i < list.size(); i++) {         
			LinkTag node = (LinkTag) list.elementAt(i);         
			System.out.println(node.extractLink());     
		}
?

?

?

?

Visitor方式解析Html?

? ?使用visitor方式访问Html,一般不用这种方式,不细说

? ? ? ? //通过指定URLConnection对象创建Parser对象?

		Parser parser = new Parser((HttpURLConnection)(new URL("http://www.google.com")).openConnection()); 
		//设置Parser对象的字符编码,一般与网页的字符编码保持一致 
        parser.setEncoding("GB2312"); 
        //创建LinkFindingVisitor对象 
        LinkFindingVisitor lvisitor = new LinkFindingVisitor("http://www.google.com"); 
        //查找http://www.qq.com的链接个数 
        parser.visitAllNodesWith(lvisitor); 
        System.out.println("网页中包含http://www.google.com的链接个数:"+lvisitor.getCount()); 
?

?

Filter方式解析HTML

? ? HtmlParser也可以解析文本在本地:

?

		Parser parser = new Parser("d:\\1.html");
		parser.setEncoding(parser.getEncoding());   
		NodeFilter filter = new NodeClassFilter(LinkTag.class);     
		NodeList list = parser.extractAllNodesThatMatch(filter);     
		for (int i = 0; i < list.size(); i++) {         
			LinkTag node = (LinkTag) list.elementAt(i);         
			System.out.println(node.extractLink());     
		}
?

?

?

?

HtmlParser自带的Filter

TagNameFilter 接受所有满足指定Tag名的TagNodes.

?

      TagNameFilter filter = new TagNameFilter("a");
      NodeList nodeList = parser.parse(filter);

NodeClassFilter 接受所有接受指定的类的节点.

?

       NodeFilter filter = new NodeClassFilter(LinkTag.class);  //如链接标签
       或
       NodeFilter filter = new NodeClassFilter(TextNode.class); //如文本标签
       NodeList nodeList = parser.parse(filter);
       Node[] nodes = nodeList.toNodeArray();  //返回Node[]节点数组的情况
       或
       NodeClassFilter filter = new NodeClassFilter(TableTag.class);对表格的过滤获取
       NodeList nodeList = parser.parse(filter);
       TableTag tableTag = (TableTag) nodeList.elementAt(0);
       TableRow[] rows = tableTag.getRows();

HasAttributeFilter 接受所有否含有某个属性(还可以设置该属性的值)的节点.

HasChildFilter 接受所有含有子节点符合该Filter的节点.

?

       TagNameFilter filter = new TagNameFilter(tag);
       HasChildFilter hasChildFilter = new HasChildFilter(filter);
       NodeList nodeList = parser.parse(hasChildFilter);