欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中使用開源庫JSoup解析HTML文件實(shí)例

 更新時(shí)間:2014年09月25日 11:09:12   投稿:junjie  
這篇文章主要介紹了Java中使用開源庫JSoup解析HTML文件實(shí)例,Jsoup是一個(gè)開源的Java庫,它可以用于處理實(shí)際應(yīng)用中的HTML,比如常見的HTML格式化就可以用它來實(shí)現(xiàn),需要的朋友可以參考下

HTML是WEB的核心,互聯(lián)網(wǎng)中你看到的所有頁面都是HTML,不管它們是由JavaScript,JSP,PHP,ASP或者是別的什么WEB技術(shù)動(dòng)態(tài)生成的。你的瀏覽器會(huì)去解析HTML并替你去渲染它們。不過如果你需要自己在Java程序中解析HTML文檔并查找某些元素,標(biāo)簽,屬性或者檢查某個(gè)特定的元素是否存在的話,那又該如何呢?如果你已經(jīng)使用Java編程多年了,我相信你肯定試過去解析XML,也使用過類似DOM或者SAX這樣的解析器,不過很有可能你從未進(jìn)行過任何的HTML解析的工作。更諷刺的是,在Java應(yīng)用中,很少會(huì)有需要你去解析HTML文檔的時(shí)候,這里并不包括Servlet或者其它的Java WEB技術(shù)。更糟糕的是,JDK核心里也沒有包括HTTP或者HTML的庫,至少我并不知道有這個(gè)。這就是為什么一碰上解析HTML文件時(shí),許多Java程序員就得先Google一下 ,看看如何在Java中取出一個(gè)HTML的標(biāo)簽。當(dāng)我有這個(gè)需要的時(shí)候,我相信肯定會(huì)有一些開源庫能實(shí)現(xiàn)這個(gè),不過我沒有想到竟然有JSoup這么酷的并且功能齊全的庫。它不僅能支持讀取并解析HTML文檔,而且還能讓你從HTML文件抽取出任何的元素,以及它們的屬性,它們的CSS屬性,你還能進(jìn)它們進(jìn)行修改。有了JSoup你簡直可以對(duì)HTML文檔做任何事情。我們將會(huì)看到如何在Java中從google主頁或者任何URL中下載并解析HTML文件的示例。

JSoup庫是什么

Jsoup是一個(gè)開源的Java庫,它可以用于處理實(shí)際應(yīng)用中的HTML。它提供了非常便利的API來進(jìn)行數(shù)據(jù)的提取及修改,充分利用了DOM,CSS以及jquery風(fēng)格方法的長處。Jsoup實(shí)現(xiàn)了WAHTWG HTML5的規(guī)范,它從HTML解析出來的DOM和Chrome以及Firefox這樣的現(xiàn)代瀏覽器解析出來的完全一致。下面是Jsoup庫的一些有用的特性:

1.Jsoup可以從URL,文件,或者字符串中獲取并解析HTML。
2.Jsoup可以查找并提取數(shù)據(jù),可以使用DOM遍歷或者CSS選擇器。
3.你可以使用Jsoup來修改HTML元素,屬性以及文本。
4.Jsoup通過一個(gè)安全的白名單確保了用戶提交的內(nèi)容是干凈的,以防止XSS攻擊。
5.Jsoup還能輸出整潔的HTML。

Jsoup的設(shè)計(jì)初衷是用于處理現(xiàn)實(shí)生活中出現(xiàn)的各種不同的HTML,包括正確有效的HTML以及不完整的無效的標(biāo)簽集合。Jsoup的一個(gè)核心競(jìng)爭力就是它的健壯性。

在Java中使用Jsoup進(jìn)行HTML解析

在這篇Java HTML解析的教程中,我們會(huì)看到在Java中使用Jsoup解析及遍歷HTML的三個(gè)不同的示例。第一個(gè)例子中,我們會(huì)解析一個(gè)HTML字符串,它的內(nèi)容就是Java中的字符串字面量組成的標(biāo)簽。第二個(gè)例子中,我們會(huì)從WEB中下載HTML文檔,而第三個(gè)例子中,我們會(huì)加載一個(gè)HTML示例文件login.html來進(jìn)行解析。這個(gè)文件是一個(gè)HTML文檔的示例,它包含title標(biāo)簽,body里面有一個(gè)div標(biāo)簽,里面包含一個(gè)表單。它擁有input標(biāo)簽來用于獲取用戶名及密碼,同時(shí)還有提交及重置的按鈕用來進(jìn)行下一步操作。它是一個(gè)正確有效的HTML,也就是說,所有的標(biāo)簽和屬性都是正確地閉合的。下面是我們這個(gè)HTML的示例文件:

復(fù)制代碼 代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
<title>Login Page</title>  
</head>  
<body>  
<div id="login" class="simple" >  
<form action="login.do">  
Username : <input id="username" type="text" /><br>  
Password : <input id="password" type="password" /><br>  
<input id="submit" type="submit" />  
<input id="reset" type="reset" />  
</form>  
</div>  
</body>  
</html> 

使用Jsoup來解析HTML非常簡單,你只需調(diào)用它的靜態(tài)方法Jsoup.parse()并傳入你的HTML字符串給它就可以了。Jsoup提供了多個(gè)重載的parse()方法,它可以從字符串,文件,URI,URL,甚至InputStream中讀取HTML文件。如果不是UTF-8編碼的話,你還可以指定字符編碼,這樣可以正確地讀取HTML文件。下面是Jsoup庫中HTML解析方法的一個(gè)完整的列表。parse(String html)方法將輸入的HTML解析成一個(gè)新的Document。在Jsoup里,Document繼承了Element,而它又繼承自Node。同樣的TextNode也繼承自Node。只要你傳入的是一個(gè)不為null的字符串,你就肯定能獲取到一個(gè)成功的有意義的解析,得到一個(gè)包含head和body元素的Document。一旦你拿到這個(gè)Document,你就可以調(diào)用Document以及它的父類Element和Node上面的適當(dāng)?shù)姆椒▉慝@取到你想要的數(shù)據(jù)了。

解析HTML文檔的Java程序

下面是一個(gè)解析HTML字符串,網(wǎng)絡(luò)上下載的HTML文件,以及本地文件系統(tǒng)中的HTML文件的完整的Java程序。你可以使用Eclipse IDE或者別的IDE甚至命令來運(yùn)行這個(gè)程序。在Eclipse里面則很簡單,拷貝這份代碼,新建一個(gè)Java工程,在src包上右鍵并粘貼進(jìn)去就可以了。Eclipse會(huì)去創(chuàng)建正確的包及同名的Java源文件的,因此工作量最小。如果你已經(jīng)有一個(gè)Java示例工程了,那么僅需一步就可以了。下面的這個(gè)Java程序展示了解析及遍歷HTML文件的三個(gè)不同例子。第一個(gè)例子中,我們直接解析了一個(gè)內(nèi)容為HTML的字符串,第二個(gè)例子中我們解析了一個(gè)從URL中下載的HTML文件,第三個(gè)中我們從本地文件系統(tǒng)中加載了一個(gè)HTML文檔并進(jìn)行解析。第一和第三個(gè)例子中都用到了parse方法來獲取一個(gè)Document對(duì)象,你可以查詢它來提取出任何的標(biāo)簽值或者屬性值。第二個(gè)例子中,我們用到了Jsoup.connect方法,它會(huì)去創(chuàng)建URL的連接,下載HTML并進(jìn)行解析。這個(gè)方法也會(huì)返回Document,它可以用于后續(xù)的查詢及獲取標(biāo)簽或者屬性的值。

復(fù)制代碼 代碼如下:

import java.io.IOException; 
  
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
 
 
/** 
[*] Java Program to parse/read HTML documents from File using Jsoup library. 
[*] Jsoup is an open source library which allows Java developer to parse HTML 
[*] files and extract elements, manipulate data, change style using DOM, CSS and 
[*] JQuery like method. 
[*] 
[*] @author Javin Paul 
[*]/ 
public class HTMLParser{ 
  
    public static void main(String args[]) { 
  
        // Parse HTML String using JSoup library 
        String HTMLSTring = "<!DOCTYPE html>" 
                + "<html>" 
                + "<head>" 
                + "<title>JSoup Example</title>" 
                + "</head>" 
                + "<body>" 
                + "|[b]HelloWorld[/b]" 
                + "" 
                + "</body>" 
                + "</html>"; 
  
        Document html = Jsoup.parse(HTMLSTring); 
        String title = html.title(); 
        String h1 = html.body().getElementsByTag("h1").text(); 
  
        System.out.println("Input HTML String to JSoup :" + HTMLSTring); 
        System.out.println("After parsing, Title : " + title); 
        System.out.println("Afte parsing, Heading : " + h1); 
  
        // JSoup Example 2 - Reading HTML page from URL 
        Document doc; 
        try { 
            doc = Jsoup.connect("http://google.com/").get(); 
            title = doc.title(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
  
        System.out.println("Jsoup Can read HTML page from URL, title : " + title); 
  
        // JSoup Example 3 - Parsing an HTML file in Java 
        //Document htmlFile = Jsoup.parse("login.html", "ISO-8859-1"); // wrong 
        Document htmlFile = null; 
        try { 
            htmlFile = Jsoup.parse(new File("login.html"), "ISO-8859-1"); 
        } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } // right 
        title = htmlFile.title(); 
        Element div = htmlFile.getElementById("login"); 
        String cssClass = div.className(); // getting class form HTML element 
  
        System.out.println("Jsoup can also parse HTML file directly"); 
        System.out.println("title : " + title); 
        System.out.println("class of div tag : " + cssClass); 
    } 
  

輸出:

復(fù)制代碼 代碼如下:

Input HTML String to JSoup :<!DOCTYPE html><html><head><title>JSoup Example</title></head><body><table><tr><td><h1>HelloWorld</h1></tr></table></body></html> 
After parsing, Title : JSoup Example 
Afte parsing, Heading : HelloWorld 
Jsoup Can read HTML page from URL, title : Google 
Jsoup can also parse HTML file directly title : Login Page 
class of div tag : simple 

Jsoup的好處就是它的健壯性很強(qiáng)。Jsoup HTML解析器會(huì)對(duì)你提供的HTML進(jìn)行盡量干凈的解析,而不去考慮這個(gè)HTML是否是格式良好的。它可以處理如下這些錯(cuò)誤:未閉合的標(biāo)簽(比如,Java <p>Scala to <p>JavaScala),隱式標(biāo)簽(比如,一個(gè)裸的|Java is Great被封裝到了|里面),它總能創(chuàng)建出一個(gè)文檔結(jié)構(gòu)(包含head及body的HTML,并且head里只會(huì)包含正確的元素)。這就是在Java中如何進(jìn)行HTML的解析。Jsoup是一個(gè)優(yōu)秀的健壯的開源庫,它使得讀取HTML文檔,body片段,HTML字符串,以及直接從WEB中解析HTML內(nèi)容都變得相當(dāng)簡單。在這篇文章中,我們學(xué)習(xí)了如何在Java中獲取一個(gè)特定的HTML標(biāo)簽,正如第一個(gè)例子中我們將title及H1標(biāo)簽的值提取成了文本,而第三個(gè)例子中我們學(xué)習(xí)到了如何通過提取CSS屬性來從HTML標(biāo)簽中獲取屬性值。除了強(qiáng)大的jQuery風(fēng)格的html.body().getElementsByTag("h1").text()方法,你還可以提取任意的HTML標(biāo)簽,它還提供了像Document.title()和Element.className()這樣便捷的方法,你可以快速獲取到標(biāo)題及CSS類。希望JSoup能讓你玩得愉快,很快我們將會(huì)看到關(guān)于這個(gè)API的更多的一些例子。

相關(guān)文章

最新評(píng)論