最近在項目中遇到了一個無法解決的問題,是有關於HTML源碼轉化爲標準格式的XHTML或者是XML數據的問題,這是項目中遇到的一個問題。
JTidy是一個java的用於處理HTML源碼的工具,由於HTML是半結構化的,所以其中有很多的不好的或者其他不規範標準的格式,如沒有結束標籤等等,JTidy可以去除這些不好的格式,或者補全結束標籤等這樣的功能,把半結構化的HTML轉化爲結構化的,標準的XHTML結構和XML結構,但是最近在使用時出現了問題。
這是處理時的代碼,首先參數中的htmlStr是抓取的HTML的源代碼,然後進行Tidy的設置,利用tidy處理HTML源碼,使其規範化或者標準化,然後轉化爲dom結構,對其進行處理後在轉化爲XML格式的流,但是最近碰到的問題是在處理後結構是空,也就是doc這個變量是空的,在轉化爲XML後輸出爲空。
經過調試後發現,這是tidy處理時出現了問題,這種問題的原因就在於原有的HTML代碼的格式過於不規範,已經超出了tidy能後處理的能力,雖然他很強大,但是還沒有智能到無所不能的地步,在用tidy處理並轉化爲dom結構是,由於HTML標籤轉化爲dom結構中的結點,但是卻沒有正常轉化,使其結點的層次混亂,最後再轉化爲XML格式時就出現了空的情況,所以如果出現了處理後爲空的情況,可能就是原有的HTML代碼的問題,這個解決比較困難,除非不用tidy而用其他的方法。
但是大部分情況下,tidy是可以處理的,最近做了好長時間才遇到了在處理某個網站的時候出現了這種問題,原因在於網站的HTML源碼太亂,這種情況還是出現比較少的,但是遇到了就沒辦法了。
JTidy是一個java的用於處理HTML源碼的工具,由於HTML是半結構化的,所以其中有很多的不好的或者其他不規範標準的格式,如沒有結束標籤等等,JTidy可以去除這些不好的格式,或者補全結束標籤等這樣的功能,把半結構化的HTML轉化爲結構化的,標準的XHTML結構和XML結構,但是最近在使用時出現了問題。
Document doc = null;
try {
InputStream in = String2InputStream(htmlStr);
// 設置 tidy ,準備轉換
Tidy tidy = new Tidy();
tidy.setDocType(htmlStr);
tidy.setXmlOut(true); // 輸出格式 xml
// //tidy.setDropFontTags(true); // 刪除字體節點
// tidy.setDropEmptyParas(true); // 刪除空段落
// tidy.setFixComments(true); // 修復註釋
// tidy.setFixBackslash(true); // 修復反斜杆
tidy.setMakeClean(true); // 刪除混亂的表示
tidy.setPrintBodyOnly(true);
// tidy.setQuoteNbsp(false); // 將空格輸出爲
// tidy.setQuoteMarks(false); // 將雙引號輸出爲 "
// tidy.setQuoteAmpersand(true); // 將 & 輸出爲 &
// tidy.setShowWarnings(false); // 不顯示警告信息
tidy.setInputEncoding("UTF-8"); // 輸入的流的編碼爲utf-8
tidy.setOutputEncoding("UTF-8"); // 輸出流的編碼爲utf-8
//
doc = tidy.parseDOM(in, null); // 通過 JTidy 將 HTML 網頁解析爲
in.close(); // W3C 的 Document 對象
這是處理時的代碼,首先參數中的htmlStr是抓取的HTML的源代碼,然後進行Tidy的設置,利用tidy處理HTML源碼,使其規範化或者標準化,然後轉化爲dom結構,對其進行處理後在轉化爲XML格式的流,但是最近碰到的問題是在處理後結構是空,也就是doc這個變量是空的,在轉化爲XML後輸出爲空。
經過調試後發現,這是tidy處理時出現了問題,這種問題的原因就在於原有的HTML代碼的格式過於不規範,已經超出了tidy能後處理的能力,雖然他很強大,但是還沒有智能到無所不能的地步,在用tidy處理並轉化爲dom結構是,由於HTML標籤轉化爲dom結構中的結點,但是卻沒有正常轉化,使其結點的層次混亂,最後再轉化爲XML格式時就出現了空的情況,所以如果出現了處理後爲空的情況,可能就是原有的HTML代碼的問題,這個解決比較困難,除非不用tidy而用其他的方法。
但是大部分情況下,tidy是可以處理的,最近做了好長時間才遇到了在處理某個網站的時候出現了這種問題,原因在於網站的HTML源碼太亂,這種情況還是出現比較少的,但是遇到了就沒辦法了。