Java解析HTML之NekoHTML

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

引用
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

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());
}


test1

www.sina.com.cn
www.sohu.com
www.163.com
www.qq.com

引用

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();

//获取所有内容
//****注意在查找是必须使用大写字母的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());
}

//获取所有内容
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());
}


test2


Page Title

a1 a2 a3
b1 b2 b3
c1 c2 c3
aaa bbb ccc

引用

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);



test3





aaa
bbb
ccc




引用



test3





aaa
bbb
ccc





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,和被忽略,所有的内容都被解析。 
//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 是否剥掉
                    
                    

你可能感兴趣的:(java,html,parse,NekoHTML)