HTML文档解析器 NekoHTML
NekoHTML是一個Java語言的 HTML掃描器和標(biāo)簽補(bǔ)全器(tag balancer) ,使得程序能解析HTML文檔并用標(biāo)準(zhǔn)的XML接口來訪問其中的信息。這個解析器能夠掃描HTML文件并“修正”許多作者(人或機(jī)器)在編寫HTML文檔 過程中常犯的錯誤。
NekoHTML能增補(bǔ)缺失的父元素、自動用結(jié)束標(biāo)簽關(guān)閉相應(yīng)的元素,以及不匹配的內(nèi)嵌元素標(biāo)簽。NekoHTML的開發(fā)使用了 Xerces Native Interface (XNI),后者是Xerces2的實(shí)現(xiàn)基礎(chǔ)。
?
現(xiàn)在流行的HTML解析工具主要有HTML Parser和nekohtml,我就不細(xì)介紹他們了,有興趣的話可以自己google。個人比較喜歡用nekohtml+xerces,xerces實(shí) 際上也是一個XML的解析包,nekohtml建筑在其之上,兩者搭配后可將網(wǎng)頁解析成一顆DOM樹,這樣我們對于網(wǎng)頁的操作就轉(zhuǎn)化為對這棵樹的操作了, 而這正是它和HTML Parser的不同之處,也是我喜歡它的原因。
???? 我們對網(wǎng)頁的操作主要通過org.w3c.dom中提供的接口(nekohtml+xerces提供這些接口的實(shí)現(xiàn)),熟悉XML解析的朋友對這個包一定 不會陌生。這個包中用的比較多的接口有:Node、Document、Element、Text等。Node是DOM樹中所有節(jié)點(diǎn)根接口,它的子接口有 Document、ProcessingInstruction、Element、Comment、Text等,具體的繼承層次請參考java doc。正如這些接口的名字說顯示的,它們對應(yīng)于DOM樹中相應(yīng)的元素,這里我就不細(xì)說了,下面我們通過一個例子來說明它們的使用方法。
???? 從網(wǎng)頁中抽取文本是一項(xiàng)很平常的工作,HTML Parser中提供了一個TextExtractingVisitor來實(shí)現(xiàn)這一點(diǎn),但nekohtml沒有現(xiàn)成這樣的類,我們自己寫一個也不難:
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){
?? //若是文本節(jié)點(diǎn)的話,直接返回
?? 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();
?? }
?? //對其它類型的節(jié)點(diǎn),返回空值
?? return "";
}
public static void main(String[] args) throws Exception{
?? //生成html parser
?? DOMParser parser = new DOMParser();
?? //設(shè)置網(wǎng)頁的默認(rèn)編碼
?? 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節(jié)點(diǎn),以此為根,計(jì)算其文本內(nèi)容
?? Node body = doc.getElementsByTagName("BODY").item(0);
?? System.out.println(TextExtractor(body));
}
}
???? 除了提供DOM接口外,nekohtml還有一些其他功能,如格式化網(wǎng)頁文本、確保網(wǎng)頁格式良好(well-formed)等,具體可參見nekohtml的文檔
總結(jié)
以上是生活随笔為你收集整理的HTML文档解析器 NekoHTML的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [html] 浏览器是怎么对HTML5的
- 下一篇: 前端学习(2895):课程列表和导航结合