2007-07-10
HTML parser选型测试
关键字: 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
测试编码如下:
一个打印dom节点的辅助方法如下:
测试结果如下:
getElementsByTagName getElementById
htmlcleaner 抛出异常java.lang.NoSuchFieldError: fRecognizedFeatures
htmlparser 在分析到script中的字符串包含"</b>"出现逻辑错误,将该</b>误判为script结束
nekohtml pass pass
nekohtml入选。
可以结构化方式操作HTML内容,使网页内容的提取、重构变得容易。
以下链接列出了相关的java opensource项目
http://www.open-open.com/30.htm
根据网友的评论,将htmlcleaner、htmlparser、nekohtml列入候选。
以附件html作为测试用例,按照常见的getElementsByTagName提取Body,
以getElementById获取id为'content6'的script
测试编码如下:
java 代码
- static public String Neko(String path) throws SAXException, IOException{
- DOMParser parser = new DOMParser();
- //InputSource in = new InputSource(new Reader());
- parser.parse(TPPath+path);
- Document doc=parser.getDocument();
- org.w3c.dom.NodeList nl = doc.getElementsByTagName("body");
- System.out.println(printNode(nl.item(0)));
- System.out.println("----------------------------------------");
- org.w3c.dom.Element n = doc.getElementById("content6");
- System.out.println(printNode(n));
- return "";
- }
- static public String htmlparser(String path) throws ParserException{
- // one of several constructors
- Parser p = new Parser(TPPath+path);
- NodeList nl=p.parse(new TagNameFilter("body"));
- System.out.println(nl.elementAt(0).toHtml());
- System.out.println("----------------------------------------");
- Parser p2 = new Parser(TPPath+path);
- NodeList nl2=p2.parse(new HasAttributeFilter("id","content6"));
- System.out.println(nl2.elementAt(0).toHtml());
- return "";
- }
- static public String htmlcleaner(String path) throws Exception{
- // one of several constructors
- HtmlCleaner cleaner = new HtmlCleaner(new File(TPPath+path));
- org.w3c.dom.Document doc = cleaner.createDOM();
- org.w3c.dom.NodeList nl = doc.getElementsByTagName("body");
- System.out.println(printNode(nl.item(0)));
- System.out.println("----------------------------------------");
- org.w3c.dom.Element n=doc.getElementById("content6");
- System.out.println(printNode(n));
- return "";
- }
java 代码
- public static String printNode(Node node) {
- StringBuffer sbuf=new StringBuffer();
- String nn=node.getNodeName();
- boolean btag=true;
- if(nn.equals("#text")) btag=false;
- if(btag){
- if(node.hasAttributes()){
- NamedNodeMap attrs=node.getAttributes();
- StringBuffer abuf= new StringBuffer();
- for(int i=0,len=attrs.getLength(); i<len; i++){
- Node attr=attrs.item(i);
- abuf.append(" "+attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");
- }
- sbuf.append("<"+nn+abuf.toString()+">");
- }else sbuf.append("<"+nn+">");
- }
- if(node.hasChildNodes()){
- Node child = node.getFirstChild();
- sbuf.append(child.getNodeValue());
- while (child != null) {
- sbuf.append(printNode(child));
- child = child.getNextSibling();
- }
- }
- if(btag)
- sbuf.append("</"+nn+">");
- return sbuf.toString();
- }
测试结果如下:
getElementsByTagName getElementById
htmlcleaner 抛出异常java.lang.NoSuchFieldError: fRecognizedFeatures
htmlparser 在分析到script中的字符串包含"</b>"出现逻辑错误,将该</b>误判为script结束
nekohtml pass pass
nekohtml入选。
评论
chen4w
2007-08-14
从数据库表中直接获取的数据形式上可能并不满足要求,你看sina新闻的摘要,标题字数都对仗得那么好,没有人工干预恐怕很难做到
jacklondon
2007-08-14
好像作者很好没有说明 HTML parser 的作用。
内容管理(cms)的数据都在数据库中,如果“要将网站频道的摘要(summery)合并到父频道的封面”,直接从对应的数据库表中获取岂不更便当?
Jacklondon
http://blog.csdn.net/jacklondon
内容管理(cms)的数据都在数据库中,如果“要将网站频道的摘要(summery)合并到父频道的封面”,直接从对应的数据库表中获取岂不更便当?
Jacklondon
http://blog.csdn.net/jacklondon
发表评论
- 浏览: 38732 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最新评论
-
拿什么拯救你,我的ie
深有同感 关于树的问题 我自己写的树 在ie上极限是7000节点 ,主要瓶颈就 ...
-- by careprad -
拿什么拯救你,我的ie
ie8 和 ie6确实不兼容了
-- by kimmking -
拿什么拯救你,我的ie
IE可以用vs。net自带的调试工具 是目前最好用的js调试工具。
-- by kimmking -
拿什么拯救你,我的ie
真是严肃的问题,做了些日子跨浏览器程序开发都要疯了。在ie8下的,在ie6 下怎 ...
-- by trains629 -
拿什么拯救你,我的ie
总结的不错 1、大量的节点,需要ajax,至少也要是延迟加载 2、js调试,. ...
-- by kimmking






评论排行榜