在HtmlParser中,可以采用Visitor和Filter两种方式来提取网页的信息。
一、Visitor方式
Visitord的解析过程
用一个URL或页面String做一个Parser
用这个Parser做一个Visitor
使用Parser.visitAllNodeWith(Visitor)来遍历节点
获取Visitor遍历后得到的数据
二、Filter方式
系统定义了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)来做进一步的访问。
三、Visitor和Filter的比较
如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。针对不同的应用可以采用visitor来遍历Html节点提取数据,也可以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。
四、例子
// 使用 ObjectFindingVisitor 配合不同的 Tag.class 分析网页
try
{
ImageTag imgLink;
ObjectFindingVisitor visitor = new ObjectFindingVisitor(ImageTag.class);
Parser parser = new Parser();
parser.setURL(url);
parser.setEncoding(parser.getEncoding());
parser.visitAllNodesWith(visitor);
Node[] nodes = visitor.getTags();
for (int i = 0; i < nodes.length; i++)
{
// ImageTag
imgLink = (ImageTag) nodes[i];
// "http://www.msn.com.tw/webinclude/zh-tw/images/msn.gif" => ImageURL
System.out.println("ImageURL = " + imgLink.getImageURL());
// "/webinclude/zh-tw/images/msn.gif" => ImageLocation
System.out.println("ImageLocation = " + imgLink.extractImageLocn());
// SRC value
System.out.println("SRC = " + imgLink.getAttribute("SRC"));
}
}
catch (Exception e)
{
e.printStackTrace();
}
// 使用不同的 NodeFilter 分析网页
try
{
NodeFilter filter = new TagNameFilter("IMG");
NodeFilter filter1 = new NodeClassFilter(ImageTag.class);
Parser parser = new Parser();
parser.setURL(url);
parser.setEncoding(parser.getEncoding());
NodeList list = parser.extractAllNodesThatMatch(filter);
for (int i = 0; i < list.size(); i++)
{
System.out.println(list.elementAt(i).toHtml());
}
}
catch (Exception e)
{
e.printStackTrace();
}
// 直接使用 Tag.class 分析网页
try
{
Parser parser = new Parser();
parser.setURL(url);
parser.setEncoding(parser.getEncoding());
Node[] nodes = parser.extractAllNodesThatAre(ImageTag.class);
for (int i = 0; i < nodes.length; i++)
{
ImageTag imageTag = (ImageTag) nodes[i];
System.out.println(imageTag.getImageURL());
}
}
catch (Exception e)
{
e.printStackTrace();
}