是否有能夠使用Java將HTML文檔讀入DOM樹的解析器/庫?我想使用Java提供的標準DOM/Xpath
API。使用Java將HTML文件讀取到DOM樹
大多數庫似乎都有自定義API來解決此任務。此外,HTML到XML-DOM的轉換似乎大多數可用的解析器都不支持。
任何有關良好HTML DOM解析器的想法或經驗?
是否有能夠使用Java將HTML文檔讀入DOM樹的解析器/庫?我想使用Java提供的標準DOM/Xpath
API。使用Java將HTML文件讀取到DOM樹
大多數庫似乎都有自定義API來解決此任務。此外,HTML到XML-DOM的轉換似乎大多數可用的解析器都不支持。
任何有關良好HTML DOM解析器的想法或經驗?
TagSoup可以做你想做的。
由於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可能有點麻煩,但經過這麼多年的使用,我不再介意了。
這是一個可能有用的鏈接。這是一個開源的Java解析器列表Open Source HTML Parsers in Java
Neko + Xerces做得很好。謝謝所有回答 – 2009-01-19 14:41:47
謹防JTidy。它有一個內存泄漏錯誤。如果你在生產系統中運行它,它最終會炸燬 - StackOverflowError並最終導致OutOfMemoryError。也就是說,它非常擅長修復破損的html,以便您可以將它提供給dom解析器。 – Joel 2009-11-13 10:14:53