日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

HTML文档解析器 NekoHTML

發(fā)布時(shí)間:2023/12/9 HTML 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HTML文档解析器 NekoHTML 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

NekoHTML是一個(gè)Java語言的 HTML掃描器和標(biāo)簽補(bǔ)全器(tag balancer) ,使得程序能解析HTML文檔并用標(biāo)準(zhǔn)的XML接口來訪問其中的信息。這個(gè)解析器能夠掃描HTML文件并“修正”許多作者(人或機(jī)器)在編寫HTML文檔 過程中常犯的錯(cuò)誤。

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。個(gè)人比較喜歡用nekohtml+xerces,xerces實(shí) 際上也是一個(gè)XML的解析包,nekohtml建筑在其之上,兩者搭配后可將網(wǎng)頁解析成一顆DOM樹,這樣我們對于網(wǎng)頁的操作就轉(zhuǎn)化為對這棵樹的操作了, 而這正是它和HTML Parser的不同之處,也是我喜歡它的原因。
???? 我們對網(wǎng)頁的操作主要通過org.w3c.dom中提供的接口(nekohtml+xerces提供這些接口的實(shí)現(xiàn)),熟悉XML解析的朋友對這個(gè)包一定 不會陌生。這個(gè)包中用的比較多的接口有:Node、Document、Element、Text等。Node是DOM樹中所有節(jié)點(diǎn)根接口,它的子接口有 Document、ProcessingInstruction、Element、Comment、Text等,具體的繼承層次請參考java doc。正如這些接口的名字說顯示的,它們對應(yīng)于DOM樹中相應(yīng)的元素,這里我就不細(xì)說了,下面我們通過一個(gè)例子來說明它們的使用方法。
???? 從網(wǎng)頁中抽取文本是一項(xiàng)很平常的工作,HTML Parser中提供了一個(gè)TextExtractingVisitor來實(shí)現(xiàn)這一點(diǎn),但nekohtml沒有現(xiàn)成這樣的類,我們自己寫一個(gè)也不難:

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。