HTML parser选型测试

阅读更多
内容管理(cms)常常需要将网站频道的摘要(summery)合并到父频道的封面,引入HTML parser,
 可以结构化方式操作HTML内容,使网页内容的提取、重构变得容易。
 以下链接列出了相关的java opensource项目
 http://www.open-open.com/30.htm
 根据网友的评论,将htmlcleaner、htmlparser、nekohtml列入候选。
 以附件html作为测试用例,按照常见的getElementsByTagName提取Body,
 以getElementById获取id为'content6'的script
 测试编码如下:
java 代码
 
  1. static public String Neko(String path) throws SAXException, IOException{  
  2.     DOMParser parser = new DOMParser();  
  3.     //InputSource in = new InputSource(new Reader());  
  4.     parser.parse(TPPath+path);  
  5.     Document doc=parser.getDocument();  
  6.     org.w3c.dom.NodeList nl = doc.getElementsByTagName("body");  
  7.     System.out.println(printNode(nl.item(0)));  
  8.     System.out.println("----------------------------------------");  
  9.     org.w3c.dom.Element n = doc.getElementById("content6");  
  10.     System.out.println(printNode(n));  
  11.     return "";  
  12. }  
  13. static public String htmlparser(String path) throws ParserException{  
  14.     // one of several constructors  
  15.     Parser p = new Parser(TPPath+path);  
  16.     NodeList nl=p.parse(new TagNameFilter("body"));  
  17.     System.out.println(nl.elementAt(0).toHtml());  
  18.     System.out.println("----------------------------------------");  
  19.     Parser p2 = new Parser(TPPath+path);  
  20.     NodeList nl2=p2.parse(new HasAttributeFilter("id","content6"));  
  21.     System.out.println(nl2.elementAt(0).toHtml());  
  22.     return "";  
  23. }  
  24. static public String htmlcleaner(String path) throws Exception{  
  25.     // one of several constructors  
  26.     HtmlCleaner cleaner = new HtmlCleaner(new File(TPPath+path));  
  27.     org.w3c.dom.Document doc = cleaner.createDOM();  
  28.     org.w3c.dom.NodeList nl = doc.getElementsByTagName("body");  
  29.     System.out.println(printNode(nl.item(0)));  
  30.     System.out.println("----------------------------------------");  
  31.     org.w3c.dom.Element n=doc.getElementById("content6");  
  32.     System.out.println(printNode(n));  
  33.     return "";  
  34. }  
一个打印dom节点的辅助方法如下:
java 代码
 
  1. public static String printNode(Node node) {  
  2.     StringBuffer sbuf=new StringBuffer();  
  3.     String nn=node.getNodeName();  
  4.     boolean btag=true;  
  5.     if(nn.equals("#text")) btag=false;  
  6.     if(btag){  
  7.       if(node.hasAttributes()){  
  8.       NamedNodeMap attrs=node.getAttributes();  
  9.       StringBuffer abuf= new StringBuffer();  
  10.       for(int i=0,len=attrs.getLength(); i
  11.           Node attr=attrs.item(i);  
  12.           abuf.append(" "+attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");  
  13.       }  
  14.       sbuf.append("<"+nn+abuf.toString()+">");  
  15.       }else  sbuf.append("<"+nn+">");  
  16.     }  
  17.     if(node.hasChildNodes()){  
  18.      Node child = node.getFirstChild();  
  19.      sbuf.append(child.getNodeValue());  
  20.      while (child != null) {  
  21.          sbuf.append(printNode(child));  
  22.          child = child.getNextSibling();  
  23.      }  
  24.     }  
  25.     if(btag)  
  26.       sbuf.append("+nn+">");  
  27.     return sbuf.toString();  
  28. }  

 测试结果如下:
                   getElementsByTagName        getElementById
htmlcleaner         抛出异常java.lang.NoSuchFieldError: fRecognizedFeatures
htmlparser         在分析到script中的字符串包含""出现逻辑错误,将该误判为script结束
nekohtml            pass                        pass

nekohtml入选。
  • 藏品.rar (57.6 KB)
  • 下载次数: 88

你可能感兴趣的:(HTML,OpenSource,CMS,项目管理)