Nutch中的html页面的解析问题

今天主要研究了Nutch中的html页面的解析问题,因为我的任务是从页面中提取特定的文本,因此首先要找到Nutch如何将html中的文本提取出来。Nutch提供了两种html解析器,nekohtml和tagsoup,我采用了neko的解析器,在看了代码后,发现其提取文本的方法在org.apache.nutch.parse.html中的DOMContentUtils文件中,主要的函数是getTextHelper。下面做一下解释。

private boolean getTextHelper(StringBuffer sb, Node node,
                                             boolean abortOnNestedAnchors,
                                             int anchorDepth) {
    boolean abort = false;
    NodeWalker walker = new NodeWalker(node);// NodeWalk类用来非递归遍历DOM树节点
    int myint=1;
   
    while (walker.hasNext()){ //如果存在节点
   
      Node currentNode = walker.nextNode();//获取下一个节点
      String nodeName = currentNode.getNodeName();//获取节点名
      short nodeType = currentNode.getNodeType();//节点类型
      
      if ("script".equalsIgnoreCase(nodeName)) {//不处理脚本
        walker.skipChildren();
      }
      if ("style".equalsIgnoreCase(nodeName)) {//不处理style
        walker.skipChildren();
      }
      if (abortOnNestedAnchors && "a".equalsIgnoreCase(nodeName)) {//检测是否嵌套
        anchorDepth++;
        if (anchorDepth > 1) {
          abort = true;
          break;
        }       
      }
      if (nodeType == Node.COMMENT_NODE) {//不处理注释
        walker.skipChildren();
      }
      if (nodeType == Node.TEXT_NODE) {
        // cleanup and trim the value
        String text = currentNode.getNodeValue();//获取文本内容
        text = text.replaceAll("\\s+", " ");//消除所有空格和转行等字符
   text = text.trim();
        if (text.length() > 0) {
          if (sb.length() > 0) sb.append(' ');
         sb.append(text);
        }
      }
    }
}

调用这个函数的类是htmlParser类,如果想自己写一个提取文本的函数,可以做相应修改。

转自: 实习日记(六)

你可能感兴趣的:(Nutch中的html页面的解析问题)