`
wode66
  • 浏览: 738335 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HtmlParser学习笔记(四)-- 使用Filter过滤结点

阅读更多

    使用TagNameFilter过滤所有table标签结点。

 

package com.javaeye.suo.htmlparser.samples;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import com.javaeye.suo.htmlparser.HtmlParserUtils;

public class FilterDemo {

	/**
	 * 使用TagNameFilter过滤所有table标签结点。
	 * @param parser 
	 */
	public void filter(Parser parser) {
		
		
		NodeList nodelist;
		try {
			/*
			 * 过滤所有table标签结点。
			 */
			NodeFilter filter = new TagNameFilter("table");
			nodelist = parser.parse(filter);
			
			Node node = nodelist.elementAt(0);
			Node firstChild = node.getFirstChild();
			Node secondChild = firstChild.getNextSibling();
			Node thirdChild = secondChild.getNextSibling();
			Node forthChild = thirdChild.getNextSibling();
			
			System.out.println("node-->" + node.getText() + "-->" + node.toHtml());
			System.out.println("firstChild-->" + firstChild.getText() + "-->" + firstChild.toHtml());//注意换行符,此结点为换行符。
			System.out.println("secondChild-->" + secondChild.getText() + "-->" + secondChild.toHtml());
			System.out.println("thirdChild-->" + thirdChild.getText() + "-->" + thirdChild.toHtml());
			System.out.println("forthChild-->" + forthChild.getText() + "-->" + forthChild.toHtml());
			
		} catch (ParserException e1) {
			e1.printStackTrace();
		}
	}
	public static void main(String[] args) {
		String urlStr = "http://localhost:8080/HtmlParser/htmlparser.html";
		Parser parser = HtmlParserUtils.getParserWithUrlConn(urlStr, "utf-8");
		FilterDemo filter = new FilterDemo();
		filter.filter(parser);
	}

}

    关键代码:NodeFilter filter = new TagNameFilter("table");

   

补充

一、Filter简介

     如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。所以说要想用HtmlParser,首先要熟悉上面讲到的数据组织。
     系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。
      Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:
NodeList nodeList = myParser.parse(someFilter);
      解析之后,我们可以采用:
          Node[] nodes = nodeList.toNodeArray();
     来获取节点数组,也可以直接访问:
          Node node = nodeList.elementAt(i)来获取Node。
     另外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的extractAllNodesThatMatch (someFilter)来进一步过滤,同时又可以用NodeList的isitAllNodesWith(someVisitor)来做进一步的访问。
     这样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不同的应用可以采用visitor来遍历Html节点提取数据,也可 以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。
二、别人的总结
(1)利用NodeFilter对网页进行分析
1、生成一个Parser
a.通过url提取网络上的网页
Parser parser = new Parser();
parser.setURL("http://www.yahoo.com.cn");
b.提取本地网页文件
通过读文件把网页文件转化成字符串;
Parser parser=Parser.createParser(html,charset);
2、利用NodeFilter做一个filter
a.利用Tag Name
NodeFilter filter=new TagNameFilter("IMG");
b.利用Tag Class
NodeFilter filter = new NodeClassFilter(ImageTag.class);
3、通过匹配filter,得到所有符合条件的Tag
NodeList list=parser.extractAllNodesThat(filter);
for(int i=0;i String content=list.elementAt(i).toHtml();//得到符合条件的Tag内容
如果针对具体情况进行更加详细的处理,则:
ImageTag imageTag=(ImageTag)list.elementAt(i);
 …………
}
然后根据需要做相应的处理。

(2) 、利用Visitor对网页进行分析
1、生成一个Parser 
a.通过url提取网络上的网页
Parser parser = new Parser();
parser.setURL("http://www.yahoo.com.cn");
b.提取本地网页文件
通过读文件把网页文件转化成字符串;
Parser parser=Parser.createParser(html,charset);
2、用visitor访问页面
ex:ObjectFindingVisitor visitor=new ObjectFindingVisitor();
    parser.visitAllNodesWith(visitor);
3、通过特定的visitor得到符合条件的Tag
Node[] nodes=visitor.getTags();
for(int i=0;i ImageTag imageTag=(ImageTag)nodes[i];
 …………
//根据需要做特定处理
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics