2009-01-19 51 views
12

是否有能夠使用Java將HTML文檔讀入DOM樹的解析器/庫?我想使用Java提供的標準DOM/Xpath API。使用Java將HTML文件讀取到DOM樹

大多數庫似乎都有自定義API來解決此任務。此外,HTML到XML-DOM的轉換似乎大多數可用的解析器都不支持。

任何有關良好HTML DOM解析器的想法或經驗?

回答

6

JTidy,要麼通過處理流到XHTML,然後使用您最喜歡的DOM實現來重新解析,要麼使用parseDOM,如果有限的DOM imp給你足夠的話。

或者Neko

+0

Neko + Xerces做得很好。謝謝所有回答 – 2009-01-19 14:41:47

+1

謹防JTidy。它有一個內存泄漏錯誤。如果你在生產系統中運行它,它最終會炸燬 - StackOverflowError並最終導致OutOfMemoryError。也就是說,它非常擅長修復破損的html,以便您可以將它提供給dom解析器。 – Joel 2009-11-13 10:14:53

-1

Apache's Xerces2 parser應該做你想做的。

+3

Xerces驗證非常嚴格,使其不適合閱讀真實世界的HTML頁面。 – 2012-05-30 08:19:51

3

由於HTML文件通常有問題,因此您需要先使用解析器/掃描儀清理它們。我曾經使用過JTidy,但從未愉快。 NekoHTML的作品沒問題,但是這些工具中的任何一種都只是對想要的內容做出最好的猜測。您實際上要求讓程序更改文檔的標記,直到它符合架構。這可能會導致結構(標記),樣式或內容丟失。這是不可避免的,除非您通過瀏覽器手動掃描(然後您必須信任瀏覽器),否則您不會真正知道缺失的內容。

這真的取決於你的目的—如果你有成千上萬的醜陋的文件與大量無關(非HTML)標記,然後手動過程可能是不合理的。如果您的目標是幾個重要文檔的準確性,那麼手動修復它們是一個合理的建議。

一種方法是在編輯循環中使用錯誤消息最終修復損壞的標記,從而通過格式良好的和/或驗證解析器重複傳遞源的手動過程。這確實需要對XML有所瞭解,但這不是一個糟糕的教育。

隨着Java 5的必要XML特性—被稱爲JAXP API —現在已內置到Java本身;你不需要任何外部庫。

您首先獲取DocumentBuilderFactory的實例,設置其功能,創建DocumentBuilder(解析器),然後使用InputSource調用其parse()方法。 InputSource有許多可能的構造函數,在以下示例中使用StringReader:

import javax.xml.parsers.*; 
// ... 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setValidating(false); 
dbf.setNamespaceAware(true); 
dbf.setIgnoringComments(false); 
dbf.setIgnoringElementContentWhitespace(false); 
dbf.setExpandEntityReferences(false); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
return db.parse(new InputSource(new StringReader(source))); 

這將返回一個DOM Document。如果您不介意使用外部庫,那麼也有JDOM和XOM API,雖然它們比JAXP中的SAX和DOM API有一些優勢,但它們確實需要添加非Java庫。 DOM可能有點麻煩,但經過這麼多年的使用,我不再介意了。