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<len; 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中的字符串包含"</b>"出现逻辑错误,将该</b>误判为script结束
nekohtml            pass                        pass

nekohtml入选。

转载于:https://my.oschina.net/u/1440018/blog/543239

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值