HTML文档解析器 NekoHTML
NekoHTML是一個Java語言的 HTML掃描器和標簽補全器(tag balancer) ,使得程序能解析HTML文檔并用標準的XML接口來訪問其中的信息。這個解析器能夠掃描HTML文件并“修正”許多作者(人或機器)在編寫HTML文檔 過程中常犯的錯誤。
NekoHTML能增補缺失的父元素、自動用結束標簽關閉相應的元素,以及不匹配的內嵌元素標簽。NekoHTML的開發使用了 Xerces Native Interface (XNI),后者是Xerces2的實現基礎。
?
現在流行的HTML解析工具主要有HTML Parser和nekohtml,我就不細介紹他們了,有興趣的話可以自己google。個人比較喜歡用nekohtml+xerces,xerces實 際上也是一個XML的解析包,nekohtml建筑在其之上,兩者搭配后可將網頁解析成一顆DOM樹,這樣我們對于網頁的操作就轉化為對這棵樹的操作了, 而這正是它和HTML Parser的不同之處,也是我喜歡它的原因。
???? 我們對網頁的操作主要通過org.w3c.dom中提供的接口(nekohtml+xerces提供這些接口的實現),熟悉XML解析的朋友對這個包一定 不會陌生。這個包中用的比較多的接口有:Node、Document、Element、Text等。Node是DOM樹中所有節點根接口,它的子接口有 Document、ProcessingInstruction、Element、Comment、Text等,具體的繼承層次請參考java doc。正如這些接口的名字說顯示的,它們對應于DOM樹中相應的元素,這里我就不細說了,下面我們通過一個例子來說明它們的使用方法。
???? 從網頁中抽取文本是一項很平常的工作,HTML Parser中提供了一個TextExtractingVisitor來實現這一點,但nekohtml沒有現成這樣的類,我們自己寫一個也不難:
import java.io.BufferedReader;
import java.io.FileReader;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class Demo {
public static String TextExtractor(Node root){
?? //若是文本節點的話,直接返回
?? if (root.getNodeType() == Node.TEXT_NODE) {
??? return root.getNodeValue().trim();
?? }
?? if(root.getNodeType() == Node.ELEMENT_NODE) {
??? Element elmt = (Element) root;
??? //拋棄腳本
??? if (elmt.getTagName().equals("STYLE")
????? || elmt.getTagName().equals("SCRIPT"))
???? return "";
???
??? NodeList children = elmt.getChildNodes();
??? StringBuilder text = new StringBuilder();
??? for (int i = 0; i < children.getLength(); i++) {
???? text.append(TextExtractor(children.item(i)));
??? }
??? return text.toString();
?? }
?? //對其它類型的節點,返回空值
?? return "";
}
public static void main(String[] args) throws Exception{
?? //生成html parser
?? DOMParser parser = new DOMParser();
?? //設置網頁的默認編碼
?? parser.setProperty(
???? "http://cyberneko.org/html/properties/default-encoding ",
???? "gb18030");
?? //input file
?? BufferedReader in = new BufferedReader(new FileReader("input.htm"));
?? parser.parse(new InputSource(in));
?? Document doc = parser.getDocument();
?? //獲得body節點,以此為根,計算其文本內容
?? Node body = doc.getElementsByTagName("BODY").item(0);
?? System.out.println(TextExtractor(body));
}
}
???? 除了提供DOM接口外,nekohtml還有一些其他功能,如格式化網頁文本、確保網頁格式良好(well-formed)等,具體可參見nekohtml的文檔
總結
以上是生活随笔為你收集整理的HTML文档解析器 NekoHTML的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] 浏览器是怎么对HTML5的
- 下一篇: 前端学习(2895):课程列表和导航结合