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、获取元素内容
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
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
<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、补充修正
<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
<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
http://nekohtml.sourceforge.net/
http://xerces.apache.org/xerces2-j/
版本:nekohtml_1.9.15.jar xerces-2.9.1
1、获取元素内容
- //创建一个解析器
- DOMParser parser = new DOMParser();
- //解析HTML文件
- parser.parse("html/test1.html");
- //获取解析后的DOM树
- Document document = parser.getDocument();
- //通过getElementsByTagName获取Node
- NodeList nodeList = document.getElementsByTagName("a");
- for (int i = 0; i < nodeList.getLength(); i++) {
- Element e = (Element)nodeList.item(i);
- System.out.print(e.getAttribute("href") + "\t");
- System.out.println(e.getTextContent());
- }
- <html>
- <head><title>test1</title></head>
- <body>
- <a href="http://www.sina.com.cn">www.sina.com.cn</a><br>
- <a href="http://www.sohu.com">www.sohu.com</a><br>
- <a href="http://www.163.com" name="test">www.163.com</a><br>
- <a href="http://www.qq.com">www.qq.com</a><br>
- </body>
- </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
- DOMParser parser = new DOMParser();
- parser.parse("html/test2.html");
- Node node = parser.getDocument();
- //获取所有<td>内容
- //****注意在查找是必须使用大写字母的tag名(NekoHTML默认将HTML的tag名都转成了大写,属性名变为小写)
- NodeList nodeList = XPathAPI.selectNodeList(node, "//TD");
- for (int i = 0; i < nodeList.getLength(); i++) {
- System.out.println(nodeList.item(i).getTextContent());
- }
- //获取所有<a>内容
- NodeList nodeList2 = XPathAPI.selectNodeList(node, "//A");
- for (int i = 0; i < nodeList2.getLength(); i++) {
- Element e = (Element) nodeList2.item(i);
- System.out.print(e.getAttribute("href") + "\t");
- System.out.println(e.getTextContent());
- }
- <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>
- <!-- 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>
- </body>
- </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
- //生成ElementRemover(默认会不输出所有的Tag名)
- ElementRemover remover = new ElementRemover();
- //设置输出的Tag名及其属性
- remover.acceptElement("title", null);
- remover.acceptElement("a", new String[]{"href"});
- //删除Tag
- remover.removeElement("script");
- //生成StringWriter
- StringWriter filteredDescription = new StringWriter();
- Writer writer = new Writer(filteredDescription, null);
- //设置Filter
- XMLDocumentFilter[] filters = { remover, writer };
- DOMParser parser = new DOMParser();
- parser.setProperty("http://cyberneko.org/html/properties/filters", filters);
- parser.parse("html/test3.html");
- //获取结果
- String description = filteredDescription.toString();
- System.out.println(description);
- <html>
- <head>
- <title>test3</title>
- <script src="http://www.iteye.com/javascripts/application.js" type="text/javascript"></script>
- </head>
- <body>
- <!-- 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>
- </body>
- </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、补充修正
- //补充修正
- StringWriter filteredDescription1 = new StringWriter();
- Writer writer1 = new Writer(filteredDescription1, null);
- XMLDocumentFilter[] filters1 = { writer1 };
- DOMParser parser1 = new DOMParser();
- parser1.setProperty("http://cyberneko.org/html/properties/filters", filters1);
- parser1.parse("html/test4.html");
- System.out.println(filteredDescription1.toString());
- System.out.println();
- //不补充修正
- StringWriter filteredDescription2 = new StringWriter();
- Writer writer2 = new Writer(filteredDescription2, null);
- XMLDocumentFilter[] filters2 = { writer2 };
- DOMParser parser2 = new DOMParser();
- parser2.setProperty("http://cyberneko.org/html/properties/filters", filters2);
- //默认为true
- parser2.setFeature("http://cyberneko.org/html/features/balance-tags",false);
- parser2.parse("html/test4.html");
- System.out.println(filteredDescription2.toString());
- System.out.println();
- //nekohtml功能(feature)列表
- //属性 默认值 值域 描述
- //http://cyberneko.org/html/features/balance-tags True 是否允许增补缺失的标签。如果要以XML方式操作HTML文件,此值必须为真。此处提供设置功能,为了性能的原因。
- //http://cyberneko.org/html/features/balance-tags/ignore-outside-content False 是否忽略文档根元素以后的数据。如果为false,<html>和<bod>被忽略,所有的内容都被解析。
- //http://cyberneko.org/html/features/document-fragment False 解析HTML片段时是否作标签增补。此功能不要用在DOMParser上,而要用在DOMFragmentParser上。
- //http://apache.org/xml/features/scanner/notify-char-refs False 当遇到字符实体引用(如&#x20;)是否将(#x20)报告给相应地文档处理器。
- //http://apache.org/xml/features/scanner/notify-builtin-refs False 当遇到XML内建的字符实体引用(如&amp;)是否将(amp)报告给相应地文档处理器。
- //http://cyberneko.org/html/features/scanner/notify-builtin-refs False 当遇到HTML内建的字符实体引用(如&copy;)是否将(copy)报告给相应地文档处理器。
- //http://cyberneko.org/html/features/scanner/script/strip-comment-delims False 是否剥掉<script>元素中的<!-- -->等注释符。
- //http://cyberneko.org/html/features/augmentations False 是否将与HTML事件有关的infoset项包括在解析管道中。
- //http://cyberneko.org/html/features/report-errors False 是否报告错误。
- //nekohtml属性列表
- //属性 默认值 值域 描述
- //http://cyberneko.org/html/properties/filters null XMLDocumentFilter[] 在解析管道的最后按数组顺序追加自定义的处理组件(过滤器),必须为数组类型。
- //http://cyberneko.org/html/properties/default-encoding Windows-1252 IANA encoding names 默认的HTML文件编码
- //http://cyberneko.org/html/properties/names/elems 默认为upper upper,lower,match 如果整理识别出的元素名称
- //http://cyberneko.org/html/properties/names/attrs 默认为lower upper,lower,no-change 如果整理识别出的属性名称
- <a href="http://www.aaa.com/">aaa
- <a href="http://www.bbb.com/">bbb
- <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
- DOMFragmentParser parser = new DOMFragmentParser();
- HTMLDocument document = new HTMLDocumentImpl();
- DocumentFragment fragment = document.createDocumentFragment();
- parser.parse("html/test5.html", fragment);
- TransformerFactory tf = TransformerFactory.newInstance();
- Transformer transformer = tf.newTransformer();
- transformer.transform(new DOMSource(fragment), new StreamResult(new OutputStreamWriter(System.out, "utf-8")));
- <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