Java解析HTML之NekoHTML

字体大小: 中小 标准 ->行高大小: 标准
NekoHTML是一个简单地HTML扫描器和标签补偿器(tag balancer),使得程序能解析HTML文档并用标准的XML接口来访问其中的信息。这个解析器能投扫描HTML文件并“修正”许多作者(人或机器)在编写HTML文档过程中常犯的错误。NekoHTML能增补缺失的父元素、自动用结束标签关闭相应的元素,以及不匹配的内嵌元素标签。NekoHTML的开发使用了Xerces Native Interface (XNI),后者是Xerces2的实现基础。 

http://nekohtml.sourceforge.net/ 
http://xerces.apache.org/xerces2-j/ 

版本:nekohtml_1.9.15.jar xerces-2.9.1
 

1、获取元素内容 
Java代码  
  1. //创建一个解析器  
  2. DOMParser parser = new DOMParser();  
  3. //解析HTML文件  
  4. parser.parse("html/test1.html");  
  5. //获取解析后的DOM树  
  6. Document document = parser.getDocument();  
  7.   
  8. //通过getElementsByTagName获取Node  
  9. NodeList nodeList = document.getElementsByTagName("a");  
  10. for (int i = 0; i < nodeList.getLength(); i++) {  
  11.     Element e = (Element)nodeList.item(i);  
  12.     System.out.print(e.getAttribute("href") + "\t");  
  13.     System.out.println(e.getTextContent());  
  14. }  

Html代码  
  1. <html>  
  2. <head><title>test1</title></head>  
  3. <body>  
  4. <a href="http://www.sina.com.cn">www.sina.com.cn</a><br>  
  5. <a href="http://www.sohu.com">www.sohu.com</a><br>  
  6. <a href="http://www.163.com" name="test">www.163.com</a><br>  
  7. <a href="http://www.qq.com">www.qq.com</a><br>  
  8. </body>  
  9. </html>  

引用

http://www.sina.com.cn www.sina.com.cn 
http://www.sohu.com www.sohu.com 
http://www.163.com www.163.com 
http://www.qq.com www.qq.com 


2、使用XPathAPI 
Java代码  
  1. DOMParser parser = new DOMParser();  
  2. parser.parse("html/test2.html");  
  3. Node node = parser.getDocument();  
  4.   
  5. //获取所有<td>内容  
  6. //****注意在查找是必须使用大写字母的tag名(NekoHTML默认将HTML的tag名都转成了大写,属性名变为小写)  
  7. NodeList nodeList = XPathAPI.selectNodeList(node, "//TD");  
  8. for (int i = 0; i < nodeList.getLength(); i++) {  
  9.   System.out.println(nodeList.item(i).getTextContent());  
  10. }  
  11.   
  12. //获取所有<a>内容  
  13. NodeList nodeList2 = XPathAPI.selectNodeList(node, "//A");  
  14. for (int i = 0; i < nodeList2.getLength(); i++) {  
  15.     Element e = (Element) nodeList2.item(i);  
  16.     System.out.print(e.getAttribute("href") + "\t");  
  17.     System.out.println(e.getTextContent());  
  18. }  

Html代码  
  1. <html>  
  2. <head><title>test2</title></head>  
  3. <body>  
  4.   
  5. <h1>Page Title</h1>  
  6.   
  7. <!-- Table -->  
  8. <table>  
  9. <tr>  
  10.   <td>a1</td>  <td>a2</td>  <td>a3</td>  
  11. </tr>  
  12. <tr>  
  13.   <td>b1</td>  <td>b2</td>  <td>b3</td>  
  14. </tr>  
  15. <tr>  
  16.   <td>c1</td>  <td>c2</td>  <td>c3</td>  
  17. </tr>  
  18. </table>  
  19.   
  20. <!-- Link -->  
  21. <a href="http://www.aaa.com/">aaa</a>  
  22. <a href="http://www.bbb.com/">bbb</a>  
  23. <a href="http://www.ccc.com/">ccc</a>  
  24.   
  25. </body>  
  26. </html>  

引用

a1 
a2 
a3 
b1 
b2 
b3 
c1 
c2 
c3 
http://www.aaa.com/ aaa 
http://www.bbb.com/ bbb 
http://www.ccc.com/ ccc 


3、设置Filter 
Java代码  收藏代码
  1. //生成ElementRemover(默认会不输出所有的Tag名)  
  2. ElementRemover remover = new ElementRemover();  
  3.   
  4. //设置输出的Tag名及其属性  
  5. remover.acceptElement("title"null);  
  6. remover.acceptElement("a"new String[]{"href"});  
  7.   
  8. //删除Tag  
  9. remover.removeElement("script");  
  10.   
  11. //生成StringWriter  
  12. StringWriter filteredDescription = new StringWriter();  
  13. Writer writer = new Writer(filteredDescription, null);  
  14.   
  15. //设置Filter  
  16. XMLDocumentFilter[] filters = { remover, writer };  
  17.   
  18. DOMParser parser = new DOMParser();  
  19. parser.setProperty("http://cyberneko.org/html/properties/filters", filters);  
  20. parser.parse("html/test3.html");  
  21.   
  22. //获取结果  
  23. String description = filteredDescription.toString();  
  24.   
  25. System.out.println(description);  

Html代码  
  1. <html>  
  2. <head>  
  3. <title>test3</title>  
  4. <script src="http://www.iteye.com/javascripts/application.js" type="text/javascript"></script>  
  5. </head>  
  6. <body>  
  7.   
  8. <!-- Link -->  
  9. <a href="http://www.aaa.com/">aaa</a>  
  10. <a href="http://www.bbb.com/">bbb</a>  
  11. <a href="http://www.ccc.com/">ccc</a>  
  12.   
  13. </body>  
  14. </html>  

引用



<TITLE>test3</TITLE> 




<!-- Link --> 
<A href="http://www.aaa.com/">aaa</A> 
<A href="http://www.bbb.com/">bbb</A> 
<A href="http://www.ccc.com/">ccc</A> 





4、补充修正 
Java代码  
  1. //补充修正  
  2. StringWriter filteredDescription1 = new StringWriter();  
  3. Writer writer1 = new Writer(filteredDescription1, null);  
  4.   
  5. XMLDocumentFilter[] filters1 = { writer1 };  
  6.   
  7. DOMParser parser1 = new DOMParser();  
  8. parser1.setProperty("http://cyberneko.org/html/properties/filters", filters1);  
  9. parser1.parse("html/test4.html");  
  10.   
  11. System.out.println(filteredDescription1.toString());  
  12. System.out.println();  
  13.   
  14. //不补充修正  
  15. StringWriter filteredDescription2 = new StringWriter();  
  16. Writer writer2 = new Writer(filteredDescription2, null);  
  17.   
  18. XMLDocumentFilter[] filters2 = { writer2 };  
  19.   
  20. DOMParser parser2 = new DOMParser();  
  21. parser2.setProperty("http://cyberneko.org/html/properties/filters", filters2);  
  22. //默认为true  
  23. parser2.setFeature("http://cyberneko.org/html/features/balance-tags",false);  
  24. parser2.parse("html/test4.html");  
  25.   
  26. System.out.println(filteredDescription2.toString());  
  27. System.out.println();  
  28.   
  29. //nekohtml功能(feature)列表  
  30. //属性 默认值 值域 描述   
  31. //http://cyberneko.org/html/features/balance-tags True 是否允许增补缺失的标签。如果要以XML方式操作HTML文件,此值必须为真。此处提供设置功能,为了性能的原因。   
  32. //http://cyberneko.org/html/features/balance-tags/ignore-outside-content False 是否忽略文档根元素以后的数据。如果为false,<html>和<bod>被忽略,所有的内容都被解析。   
  33. //http://cyberneko.org/html/features/document-fragment False 解析HTML片段时是否作标签增补。此功能不要用在DOMParser上,而要用在DOMFragmentParser上。   
  34. //http://apache.org/xml/features/scanner/notify-char-refs False 当遇到字符实体引用(如&#x20;)是否将(#x20)报告给相应地文档处理器。   
  35. //http://apache.org/xml/features/scanner/notify-builtin-refs False 当遇到XML内建的字符实体引用(如&amp;)是否将(amp)报告给相应地文档处理器。   
  36. //http://cyberneko.org/html/features/scanner/notify-builtin-refs False 当遇到HTML内建的字符实体引用(如&copy;)是否将(copy)报告给相应地文档处理器。   
  37. //http://cyberneko.org/html/features/scanner/script/strip-comment-delims False 是否剥掉<script>元素中的<!-- -->等注释符。   
  38. //http://cyberneko.org/html/features/augmentations False 是否将与HTML事件有关的infoset项包括在解析管道中。   
  39. //http://cyberneko.org/html/features/report-errors False 是否报告错误。   
  40.   
  41. //nekohtml属性列表  
  42. //属性 默认值 值域 描述   
  43. //http://cyberneko.org/html/properties/filters null XMLDocumentFilter[] 在解析管道的最后按数组顺序追加自定义的处理组件(过滤器),必须为数组类型。   
  44. //http://cyberneko.org/html/properties/default-encoding Windows-1252 IANA encoding names 默认的HTML文件编码   
  45. //http://cyberneko.org/html/properties/names/elems 默认为upper upper,lower,match 如果整理识别出的元素名称   
  46. //http://cyberneko.org/html/properties/names/attrs 默认为lower upper,lower,no-change 如果整理识别出的属性名称  

Html代码  
  1. <a href="http://www.aaa.com/">aaa  
  2. <a href="http://www.bbb.com/">bbb  
  3. <a href="http://www.ccc.com/">ccc  

引用

<HTML><HEAD></HEAD><BODY><A href="http://www.aaa.com/">aaa 
</A><A href="http://www.bbb.com/">bbb 
</A><A href="http://www.ccc.com/">ccc</A></BODY></HTML> 

<A href="http://www.aaa.com/">aaa 
<A href="http://www.bbb.com/">bbb 
<A href="http://www.ccc.com/">ccc 


5、DOMFragmentParser 
Java代码  
  1. DOMFragmentParser parser = new DOMFragmentParser();  
  2. HTMLDocument document = new HTMLDocumentImpl();  
  3. DocumentFragment fragment = document.createDocumentFragment();  
  4.   
  5. parser.parse("html/test5.html", fragment);  
  6.   
  7. TransformerFactory tf = TransformerFactory.newInstance();         
  8. Transformer transformer = tf.newTransformer();  
  9. transformer.transform(new DOMSource(fragment), new StreamResult(new OutputStreamWriter(System.out, "utf-8")));  

Html代码  
  1. <html><head><title>test2</title></head><body><h1>Page Title</h1><!-- Table --><table><tr><td>a1</td><td>a2</td><td>a3</td></tr><tr><td>b1</td><td>b2</td><td>b3</td></tr><tr><td>c1</td><td>c2</td><td>c3</td></tr></table></body></html>  

引用

<HTML> 
<HEAD> 
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<TITLE>test2</TITLE> 
</HEAD> 
<BODY> 
<H1>Page Title</H1> 
<!-- Table --> 
<TABLE> 
<TBODY> 
<TR> 
<TD>a1</TD><TD>a2</TD><TD>a3</TD> 
</TR> 
<TR> 
<TD>b1</TD><TD>b2</TD><TD>b3</TD> 
</TR> 
<TR> 
<TD>c1</TD><TD>c2</TD><TD>c3</TD> 
</TR> 
</TBODY> 
</TABLE> 
</BODY> 
</HTML> 

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68316.html