| NekoHTML學(xué)習筆記 J. Andrew Clark用Java寫(xiě)了一系列的工具(Java APIs),NekoHTML是其中之一。 NekoHTML是一個(gè)簡(jiǎn)單地HTML掃描器和標簽補償器(tag balancer) ,使得程序能解析HTML文檔并用標準的XML接口來(lái)訪(fǎng)問(wèn)其中的信息。這個(gè)解析器能投掃描HTML文件并“修正”許多作者(人或機器)在編寫(xiě)HTML文檔過(guò)程中常犯的錯誤。NekoHTML能增補缺失的父元素、自動(dòng)用結束標簽關(guān)閉相應的元素,以及不匹配的內嵌元素標簽。NekoHTML的開(kāi)發(fā)使用了Xerces Native Interface (XNI),后者是Xerces2的實(shí)現基礎。 一、運行要求 從NekoHTML主頁(yè)上下載nekohtml-latest.zip,目前版本是0.8. NekoHTML要求運行在java1.1或更高版本,Xerces-J 2.0或更高版本。(我在試用時(shí),隨便拿了個(gè)xerces的包來(lái)用,結果例如運行老時(shí)不能通過(guò),折騰半天后才發(fā)現版本不夠所致.:) 二、使用NekoHTML 1、透明地創(chuàng )建HTML解析器 利用Xerces2.0為基礎,應用程序通過(guò)JAXP實(shí)例化解析器對象時(shí),可以透明地創(chuàng )建HTML解析器,此時(shí)只需要將NekoHTML的jar文件,在CLASSPATH中放在Xerces的jar文件之前即可。nekohtmlXni.jar中的META-INF/services/org.apache.xerces.xni.parser.XMLParserConfiguration文件會(huì )被Xerces的讀取并取代標準的設置文件,此處org.apache.xerces.xni.parser.XMLParserConfiguration文件的內容就是一個(gè)字符串“org.cyberneko.html.HTMLConfiguration”。這種方法的好處是簡(jiǎn)單透明,缺點(diǎn)是影響了Xerces在其它情況下的使用。 2、便利的HTML解析器類(lèi) 要想避免上述的問(wèn)題,可以使用org.cyberneko.html.parsers包的DOM和SAX解析器類(lèi)來(lái)創(chuàng )建解析器,這兩個(gè)類(lèi)都使用了HTMLConfiguration類(lèi)。解析器一旦創(chuàng )建之后,就可以解析HTML文件,并用標準的XML接口來(lái)訪(fǎng)問(wèn)文件中的信息,就象面對的是一個(gè)XML文件一樣。 下面的代碼是NekoHTML自帶的例程,我改了一下,使其可以顯示HTML文件內容,而不顯示類(lèi)的名字。 package sample; import org.cyberneko.html.parsers.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Node; public class TestHTMLDOM { public static void main(String[] argv) throws Exception { DOMParser parser = new DOMParser(); for (int i = 0; i < argv.length; i++) { parser.parse(argv[i]); print(parser.getDocument(), ""); } } public static void print(Node node, String indent) { // System.out.println(indent+node.getClass().getName()); if (node.getNodeValue() != null){ if("".equals(node.getNodeValue().trim())){ }else{ System.out.print(indent); System.out.println(node.getNodeValue()); } } Node child = node.getFirstChild(); while (child != null) { print(child, indent+" "); child = child.getNextSibling(); } } } 編譯運行如下: cd $NEKOHTML_HOME cp build_html.xml build.xml ant java -cp nekohtml.jar;nekohtmlSamples.jar;xmlParserAPIs.jar;xercesImpl.jar sample.TestHTMLDOM test.html 如果一切正??梢燥@示HTML的內容了。 3、文檔片段解析 除了DOM和SAX類(lèi),NekoHTML還提供了一個(gè)實(shí)驗性質(zhì)的DOMFragmentParser類(lèi),用以解析HTML文件的片段。我個(gè)人認為,由于瀏覽器的強大的容錯能力,即使一個(gè)片段的HTML文件,也可以正確顯示,由此也變相地造成了很多人不再關(guān)心的HTML的完整要求了。這個(gè)類(lèi),也許將是用的最多的。下面,看看nutch是如何使用nekoHTML的。
|