HTML是WEB的核心,互聯網中你看到的所有頁面都是HTML,不管它們是由JavaScript,JSP,PHP,ASP或者是別的什么WEB技術動態生成的。你的瀏覽器會去解析HTML并替你去渲染它們。不過如果你需要自己在Java程序中解析HTML文檔并查找某些元素,標簽,屬性或者檢查某個特定的元素是否存在的話,那又該如何呢?如果你已經使用Java編程多年了,我相信你肯定試過去解析XML,也使用過類似DOM或者SAX這樣的解析器,不過很有可能你從未進行過任何的HTML解析的工作。更諷刺的是,在Java應用中,很少會有需要你去解析HTML文檔的時候,這里并不包括Servlet或者其它的Java WEB技術。更糟糕的是,JDK核心里也沒有包括HTTP或者HTML的庫,至少我并不知道有這個。這就是為什么一碰上解析HTML文件時,許多Java程序員就得先Google一下 ,看看如何在Java中取出一個HTML的標簽。當我有這個需要的時候,我相信肯定會有一些開源庫能實現這個,不過我沒有想到竟然有JSoup這么酷的并且功能齊全的庫。它不僅能支持讀取并解析HTML文檔,而且還能讓你從HTML文件抽取出任何的元素,以及它們的屬性,它們的CSS屬性,你還能進它們進行修改。有了JSoup你簡直可以對HTML文檔做任何事情。我們將會看到如何在Java中從google主頁或者任何URL中下載并解析HTML文件的示例。
JSoup庫是什么
Jsoup是一個開源的Java庫,它可以用于處理實際應用中的HTML。它提供了非常便利的API來進行數據的提取及修改,充分利用了DOM,CSS以及jquery風格方法的長處。Jsoup實現了WAHTWG HTML5的規范,它從HTML解析出來的DOM和Chrome以及Firefox這樣的現代瀏覽器解析出來的完全一致。下面是Jsoup庫的一些有用的特性:
1.Jsoup可以從URL,文件,或者字符串中獲取并解析HTML。
2.Jsoup可以查找并提取數據,可以使用DOM遍歷或者CSS選擇器。
3.你可以使用Jsoup來修改HTML元素,屬性以及文本。
4.Jsoup通過一個安全的白名單確保了用戶提交的內容是干凈的,以防止XSS攻擊。
5.Jsoup還能輸出整潔的HTML。
Jsoup的設計初衷是用于處理現實生活中出現的各種不同的HTML,包括正確有效的HTML以及不完整的無效的標簽集合。Jsoup的一個核心競爭力就是它的健壯性。
在Java中使用Jsoup進行HTML解析
在這篇Java HTML解析的教程中,我們會看到在Java中使用Jsoup解析及遍歷HTML的三個不同的示例。第一個例子中,我們會解析一個HTML字符串,它的內容就是Java中的字符串字面量組成的標簽。第二個例子中,我們會從WEB中下載HTML文檔,而第三個例子中,我們會加載一個HTML示例文件login.html來進行解析。這個文件是一個HTML文檔的示例,它包含title標簽,body里面有一個div標簽,里面包含一個表單。它擁有input標簽來用于獲取用戶名及密碼,同時還有提交及重置的按鈕用來進行下一步操作。它是一個正確有效的HTML,也就是說,所有的標簽和屬性都是正確地閉合的。下面是我們這個HTML的示例文件:
使用Jsoup來解析HTML非常簡單,你只需調用它的靜態方法Jsoup.parse()并傳入你的HTML字符串給它就可以了。Jsoup提供了多個重載的parse()方法,它可以從字符串,文件,URI,URL,甚至InputStream中讀取HTML文件。如果不是UTF-8編碼的話,你還可以指定字符編碼,這樣可以正確地讀取HTML文件。下面是Jsoup庫中HTML解析方法的一個完整的列表。parse(String html)方法將輸入的HTML解析成一個新的Document。在Jsoup里,Document繼承了Element,而它又繼承自Node。同樣的TextNode也繼承自Node。只要你傳入的是一個不為null的字符串,你就肯定能獲取到一個成功的有意義的解析,得到一個包含head和body元素的Document。一旦你拿到這個Document,你就可以調用Document以及它的父類Element和Node上面的適當的方法來獲取到你想要的數據了。
解析HTML文檔的Java程序
下面是一個解析HTML字符串,網絡上下載的HTML文件,以及本地文件系統中的HTML文件的完整的Java程序。你可以使用Eclipse IDE或者別的IDE甚至命令來運行這個程序。在Eclipse里面則很簡單,拷貝這份代碼,新建一個Java工程,在src包上右鍵并粘貼進去就可以了。Eclipse會去創建正確的包及同名的Java源文件的,因此工作量最小。如果你已經有一個Java示例工程了,那么僅需一步就可以了。下面的這個Java程序展示了解析及遍歷HTML文件的三個不同例子。第一個例子中,我們直接解析了一個內容為HTML的字符串,第二個例子中我們解析了一個從URL中下載的HTML文件,第三個中我們從本地文件系統中加載了一個HTML文檔并進行解析。第一和第三個例子中都用到了parse方法來獲取一個Document對象,你可以查詢它來提取出任何的標簽值或者屬性值。第二個例子中,我們用到了Jsoup.connect方法,它會去創建URL的連接,下載HTML并進行解析。這個方法也會返回Document,它可以用于后續的查詢及獲取標簽或者屬性的值。
輸出:
Jsoup的好處就是它的健壯性很強。Jsoup HTML解析器會對你提供的HTML進行盡量干凈的解析,而不去考慮這個HTML是否是格式良好的。它可以處理如下這些錯誤:未閉合的標簽(比如,Java <p>Scala to <p>JavaScala),隱式標簽(比如,一個裸的|Java is Great被封裝到了|里面),它總能創建出一個文檔結構(包含head及body的HTML,并且head里只會包含正確的元素)。這就是在Java中如何進行HTML的解析。Jsoup是一個優秀的健壯的開源庫,它使得讀取HTML文檔,body片段,HTML字符串,以及直接從WEB中解析HTML內容都變得相當簡單。在這篇文章中,我們學習了如何在Java中獲取一個特定的HTML標簽,正如第一個例子中我們將title及H1標簽的值提取成了文本,而第三個例子中我們學習到了如何通過提取CSS屬性來從HTML標簽中獲取屬性值。除了強大的jQuery風格的html.body().getElementsByTag("h1").text()方法,你還可以提取任意的HTML標簽,它還提供了像Document.title()和Element.className()這樣便捷的方法,你可以快速獲取到標題及CSS類。希望JSoup能讓你玩得愉快,很快我們將會看到關于這個API的更多的一些例子。
新聞熱點
疑難解答