百度空间 | 百度首页 
 
查看文章
 
HtmlParser提取信息
2006-11-15 00:52

在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();
}


类别:技术心得 | 添加到搜藏 | 浏览() | 评论 (2)
 
最近读者:
 
网友评论:
1
2006-11-15 07:40 | 回复
不是很懂,呵呵:)
 
2
2008-03-13 13:33 | 回复
写得非常不错,很清晰。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu