htmlparser 讲解

public void getLinks(String url)
 {
  // 创建一个解析器对象
  Parser parser;
  try
  {
   parser = new Parser(url);
   parser.setEncoding("GBK");

   /**
    * 布尔hasMoreNodes()方法检查是否更节点是可得到的。
    * parser.elements()返回一个迭代器(枚举)在html节点。节点可以的三种主要类型: TagNode TextNode
    * RemarkNode 迭代器是对集合进行迭代的。举个例子来说就是对数组进行遍历就可以使用迭代器,迭代器提供了各种方法对集合进行操作
    */

   for (NodeIterator i = parser.elements(); i.hasMoreNodes();)
   {
    // 一般来说,当解析与迭代器或处理一个节点列表,你将需要使用递归的。e.g:
    processMyNodes(i.nextNode());
   }

   // 创建一个NodeClassFilter接收Html标签。
   NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);
   // 创建一个元素节点列表 parser.extractAllNodesThatMatch方法所有的节点匹配滤波器
   NodeList noedlist = parser.extractAllNodesThatMatch(linkFilter);
   // 重置解释器开始 注意:调用这个方法 如果过滤后调用 之前过滤的信息回滚
   // parser.reset();
   // 解析HTML文本内容
   // System.out.println(parser.parse(null).toHtml());

   for (int i = 0; i < noedlist.size(); i++)
   {
    LinkTag node = (LinkTag) noedlist.elementAt(i);
    // System.out.println("获取href标签整个内容:"+noedlist.elementAt(i));
    // System.out.println("获取href标签链接:"+node.extractLink());
   }

  }
  catch (ParserException e)
  {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  // return ;
 }

 /**
  *
  * Node指定节点的最低要求的Lexer或分析器。 有三种类型的HTML:文本、评论和标签。
  * 你可能会希望自己定义结点被返回的Lexer分析器,但每个或类型必须支持该接口。 更具体的接口要求每个节点类型是指定的文本、评论、标记接口。
  *
  * @throws ParserException
  */
 void processMyNodes(Node node) throws ParserException
 {
  if (node instanceof TextNode)
  {
   // TextNode普通文本的HTML文档
   TextNode text = (TextNode) node;
   //   Returns the text of the node
   System.out.println("text.getText():" + text.getText());
  }
  if (node instanceof RemarkNode)
  {
   // The remark tag is identified and represented by this class.
   RemarkNode remark = (RemarkNode) node;
   System.out.println("remark.getText():" + remark.getText());
  }
  else if (node instanceof TagNode)
  {
   //TagNode代表了一个通用的标签。
   //如果没有扫描仪对给定的标签名称,这是你所得到的东西。
   //这也是所有标签的基类所造成的分析器。
   TagNode tag = (TagNode) node;
   // do whatever processing you want with the tag itself
   // ...
   // process recursively (nodes within nodes) via
   // getChildren()
   System.out.println("tag.getText:"+tag.getText());
   NodeList nl = tag.getChildren();
   if (null != nl)
    for (NodeIterator i = nl.elements(); i.hasMoreNodes();)
     processMyNodes(i.nextNode());
  }
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值