Jsoup學習之Jsoup類

Jsoup類

一、類結構

java.lang.Object

  org.jsoup.Jsoup


public classJsoup    

     extends

     Object

Jsoup類來自於org.jsoup.Jsoup包,並且繼承自Object類。

二、方法

Method Summary

static String

clean(String bodyHtml, String baseUri, Whitelist whitelist) 
使用Whitelist對輸入的Html文檔過濾,只允許特定的標籤或者屬性,防止惡意代碼。

static String

clean(String bodyHtml, String baseUri, Whitelist whitelist, Document.OutputSettings outputSettings) 
使用Whitelist對輸入的Html文檔過濾,只允許特定的標籤或者屬性,防止惡意代碼。

static String

clean(String bodyHtml, Whitelist whitelist) 
使用Whitelist對輸入的Html文檔過濾,只允許特定的標籤或者屬性,防止惡意代碼。

static Connection

connect(String url) 
創建URL連接

static boolean

isValid(String bodyHtml, Whitelist whitelist) 
判斷輸入的Html文檔是否符合Whitelist過濾條件的要求

static Document

parse(File in, String charsetName) 
解析文件的內容,生成Html

static Document

parse(File in, String charsetName, String baseUri) 
解析文件的內容,生成Html  

static Document

parse(InputStream in, String charsetName, String baseUri) 
讀取輸入流,解析成Document

static Document

parse(InputStream in, String charsetName, String baseUri, Parser parser) 

讀取輸入流,解析成Document

static Document

parse(String html) 
將字符串解析成Html文檔

static Document

parse(String html, String baseUri) 
將字符串解析成Html文檔

static Document

parse(String html, String baseUri, Parser parser) 
利用提供的Parser,將字符串解析成Html文檔

static Document

parse(URL url, int timeoutMillis) 
通過URL,解析成Document

static Document

parseBodyFragment(String bodyHtml) 
Html片段解析成body格式          

static Document

parseBodyFragment(String bodyHtml, String baseUri) 
Html片段解析成body格式 

三、方法詳解

clean

public static String clean(String bodyHtml,
                           String baseUri,
                           Whitelist whitelist)

使用Whitelist對輸入的Html文檔過濾,只允許特定的標籤或者屬性,防止惡意代碼。

參數:

bodyHtml 不安全的html片段

baseUri html中相對路徑轉換爲絕對路徑的URL

whitelist 白名單允許的html標籤和屬性

返回值:

安全的html片段

解析:

這個函數按照whitelist提供的過濾規則對html進行過濾,只保留whitelist允許的標籤和屬性。Html文檔中往往會有很多的連接、圖片、引用的外部腳本、css文件等,可能會是相對路徑,jsoup會利用baseUri這個參數,自動爲這些相對路徑加前綴變成絕對路徑。例如:<a href=”/photo/2.jpg”>圖片</a>會變成

<a href=”http://www.baidu.com/photo/2.jpg”>圖片</a>

實例:

  1. String html = "<p><ahref='http://www.baidu/' οnclick='stealCookies()'> 百度一下,你就知道 </a></p>";  
  2. String doc = Jsoup.clean(html,Whitelist.basic());  
  3. //輸出:<p><a href="http://www.baidu/"rel="nofollow"> 百度一下,你就知道 </a></p>  

注:Whitelist包含幾種過濾模式:none、basic、simpleText、basicWithImages、relaxed,具體過濾規則請參考:Whitelist類

拓展:

public static String clean(String bodyHtml,  Whitelist whitelist)
這個沒有提供baseUri這個參數,即沒有提供將相對路徑轉換爲絕對路徑的功能。
public static String clean(String bodyHtml,
                           String baseUri,
                           Whitelist whitelist,
                           Document.OutputSettings outputSettings)

Document.OutputSettings:文檔的輸出設置,控制精細打印


connect

public static Connection connect(String url)

創建URL連接

參數:

url 必須爲http或者https類型的連接.

返回值:

返回連接。你可以添加data,cookies, headers;設置user-agent, referrer,method

解析:

url建立連接,這個方法只支持httphttps協議,連接的方式可以是get也可以是post,並且可以爲連接提供所需要的信息,如datacookiesuserAgentmethod等。

實例:

  1. Document doc = Jsoup.connect("http://example.com")  
  2. .userAgent("Mozilla").data("name","jsoup").get();  
  3. Document doc = Jsoup.connect("http://example.com")  
  4. .cookie("auth","token").post();  


isValid

public static boolean isValid(String bodyHtml, Whitelist whitelist)

判斷輸入的Html文檔是否符合Whitelist過濾條件的要求。

參數:

bodyHtml 要測試的html

whitelist 測試的過濾規則whitelist

返回值:

如果html中包含的標籤和屬性都包含在whitelist定義的規則內,即whitelist沒有過濾掉bodyhtml中的內容,則返回true,否則返回false

實例:

  1. String html = "<p><ahref='http://www.baidu/'οnclick='stealCookies()'> 百度一下,你就知道 </a></p>";  
  2. System.out.println(Jsoup.isValid(html, Whitelist.basic()));  
  3. //輸出false,即Whitelist.basic()對html過濾掉了html中的部分內容,onclick這個屬性不屬於Whitelist.basic(),被過濾掉。  


parse

public static Document parse(File in,  String charsetName, String baseUri)    throws IOException

解析文件的內容,生成Html

參數:

in – html文件

charsetName 設置文檔編碼格式。如果存在標籤http-equiv,並且將charsetName設置爲null,則按照標籤http-equiv內規定的編碼進行編碼。否則爲了安全起見,一般設置爲UTF-8.

baseUri -html中相對路徑轉換爲絕對路徑的URL

返回值:

返回健全的html文檔

異常:

IOException 如果文件找不到或者不能讀取或者charsetName設置無效,拋出異常。

實例:

  1. File file = new File("C://baidu.txt");  
  2. Document doc = Jsoup.parse(file,"GBK","http://www.baidu.com");  
拓展:

public static Document parse(File in, String charsetName)  throws IOException


parse

public static Document parse(InputStream in,  String charsetName,String baseUri, Parser parser)    throws IOException

讀取輸入流,解析成Document。可以提供一個輪流的解析器(parser),例如XML解釋器(或者非XML解釋器)

參數:

in 輸入流。確保解析完成後關閉輸入流。

charsetName -設置文檔編碼格式。如果存在標籤http-equiv,並且將charsetName設置爲null,則按照標籤http-equiv內規定的編碼進行編碼。否則爲了安全起見,一般設置爲UTF-8.

baseUri -html中相對路徑轉換爲絕對路徑的URL

parser 輪流解析器

返回值:

返回健全的html文檔

異常:

IOException -如果文件找不到或者不能讀取或者charsetName設置無效,拋出異常。

實例:

  1. FileInputStream input = new FileInputStream("C://baidu.txt");  
  2. Document doc = Jsoup.parse(input, "GBK""http://www.baidu.com", Parser.htmlParser());  
  3. System.out.println(doc);  
  4. input.close();  
拓展:

public static Document parse(InputStream in, String charsetName,String baseUri)   throws IOException


parse

public static Document parse(String html,  String baseUri,  Parser parser)

Html字符串轉換爲Document。可以提供一個輪流的解析器(parser),例如XML解釋器(或者非XML解釋器)

參數:

html – Html字符串

baseUri -html中相對路徑轉換爲絕對路徑的URL

parser -輪流解析器

返回值:

返回健全的html文檔

解析:

Html字符串解析爲Document

實例:

  1. String html = "<html><head><title>Firstparse</title></head>"  
  2.              + "<body><p>Parsed HTML into adoc.</p></body></html>";  
  3. Document doc = Jsoup.parse(html,"www.baidu.com", Parser.htmlParser());  
  4. System.out.println(doc);  
拓展:

public static Document parse(String html, String baseUri)
public static Document parse(String html)


parse

public static Document parse(URL url,  int timeoutMillis)  throws IOException

連接URL,獲取Html轉換爲Document。通常使用connect函數來代替它,字符編碼的設置根據http-equiv,或者自動回落爲UTF-8編碼。

參數:

url 需要連接的URL(使用GET方法),必須使用http或者https協議。

timeoutMillis 讀取超時時間,毫秒級,如果超時會拋出IOException異常。

返回值:

解析後的Html

解析:

這個方法是與connect相兼容的方法,一般都使用connect方法來代替它。

異常:

MalformedURLException 請求的URL使用的協議不是http或者https

HttpStatusException –HTTP返回的狀態不是OK

UnsupportedMimeTypeException 響應的MIME類型不被支持

SocketTimeoutException 連接超時

IOException 連接或者讀取錯誤

實例:

  1. URL url = new URL("http://www.baidu.com");  
  2.        Document doc = Jsoup.parse(url,500);  
  3.      System.out.println(doc);  


parseBodyFragment

public static Document parseBodyFragment(String bodyHtml, String baseUri)

Html片段解析成body格式   

參數:

bodyHtml –Html片段

baseUri -html中相對路徑轉換爲絕對路徑的URL

返回值:

返回健全的html文檔

實例:

  1. String html = "<div><p>Loremipsum.</p>";  
  2. Document doc = Jsoup.parseBodyFragment(html);  
  3. System.out.println(doc);  
拓展:

public static Document parseBodyFragment(String bodyHtml)


四、總結

Jsoup類的主要功能實現的是連接URL以及對解析Html。連接URL有兩種方式:

public static Connection connect(String url)
public static Document parse(URL url, int timeoutMillis) 

一般是使用connect方法。解析html的方式可以是從文件、輸入流、字符串中獲得:

public static Documentparse(File in, String charsetName,String baseUri)

public static Document parse(InputStream in,String charsetName,String baseUri)

public static Document parse(String htmlString baseUri, Parser parser)

還可以使用clean方法對html進行過濾,使用isValid方法判斷html是否符合過濾規則。

 五、實例

  1. import java.io.File;    
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;    
  4. import java.net.URL;   
  5. import org.jsoup.Jsoup;    
  6. import org.jsoup.nodes.Document;    
  7. import org.jsoup.nodes.Element;   
  8. import org.jsoup.parser.Parser;  
  9. import org.jsoup.safety.Whitelist;  
  10.   
  11.   
  12. public class Load {  
  13.     private static Document doc;  
  14.     private static String html;  
  15.     private static String url = "http://www.baidu.com";  
  16.     private static String baseUri = "http://www.baidu.com";  
  17.     public static Document getDoc() {  
  18.         return doc;  
  19.     }  
  20.     public static void setDoc(Document doc) {  
  21.         Load.doc = doc;  
  22.     }  
  23.     public static void main(String[] args){           
  24.         try {  
  25.             LoadHtml();  
  26.         } catch (Exception e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.     }    
  30.     /** 
  31.      * 設置代理服務器(ps:單位用的代理上網) 
  32.      */  
  33.     public static void Host(){  
  34.           
  35.         System.getProperties().setProperty("proxySet""true");    
  36.         //用的代理服務器    
  37.         System.getProperties().setProperty("http.proxyHost""192.168.130.15");    
  38.         //代理端口    
  39.         System.getProperties().setProperty("http.proxyPort""8848");  
  40.     }  
  41.     public static void LoadHtml() throws Exception{  
  42.         Host();  
  43.         JsoupClean();  
  44.         JsoupConnect();  
  45.         JsoupIsValid();  
  46.         JsoupParseFile();  
  47.         JsoupParseStream();  
  48.         JsoupParseStr();  
  49.         JsoupURL();  
  50.         JsoupBody();  
  51.     }  
  52.     /** 
  53.      * html過濾 
  54.      */  
  55.     public static void JsoupClean(){  
  56.         html = "<p><a href='http://blog.csdn.net/xyw_eliot' οnclick='stealCookies()'> Eliot </a></p>";  
  57.         String doc = Jsoup.clean(html, baseUri, Whitelist.basic());   
  58.         System.out.println(doc);  
  59.     }  
  60.     /** 
  61.      * 連接URL返回Document 
  62.      * @throws IOException 
  63.      */  
  64.     public static void JsoupConnect() throws IOException{  
  65.         doc = Jsoup.connect(url).get();  
  66.         System.out.println(doc);  
  67.     }  
  68.     /** 
  69.      * 判斷是否符合過濾規則 
  70.      */  
  71.     public static void JsoupIsValid(){  
  72.         html = "<p><a href='http://www.baidu/'οnclick='stealCookies()'> 百度一下,你就知道 </a></p>";  
  73.         System.out.println(Jsoup.isValid(html, Whitelist.basic()));  
  74.     }  
  75.     /** 
  76.      * 解析文件 
  77.      * @throws IOException 
  78.      */  
  79.     public static void JsoupParseFile() throws IOException{  
  80.         File file = new File("C://baidu.txt");  
  81.         doc = Jsoup.parse(file, "GBK", baseUri);  
  82.         System.out.println(doc);  
  83.     }  
  84.     /** 
  85.      * 解析流 
  86.      * @throws Exception 
  87.      */  
  88.     public static void JsoupParseStream() throws Exception{  
  89.         FileInputStream in = new FileInputStream("C://baidu.txt");  
  90.         doc = Jsoup.parse(in, "GBK", baseUri);  
  91.         System.out.println(doc);  
  92.         in.close();  
  93.     }  
  94.     /** 
  95.      * 解析字符串 
  96.      */  
  97.     public static void JsoupParseStr(){  
  98.         html = "<html><head><title>First parse</title></head>"  
  99.               + "<body><p>Parsed HTML into a doc.</p></body></html>";  
  100.         doc = Jsoup.parse(html, baseUri);  
  101.         System.out.println(doc);  
  102.     }  
  103.     /** 
  104.      * 解析URL 
  105.      * @throws Exception 
  106.      */  
  107.     public static void JsoupURL() throws Exception{  
  108.         URL url = new URL("http://www.baidu.com");  
  109.         doc = Jsoup.parse(url, 500);  
  110.         System.out.println(doc);  
  111.     }  
  112.     /** 
  113.      * 將html片段解析爲body格式 
  114.      */  
  115.     public static void JsoupBody(){  
  116.         html = "<div><p>Lorem ipsum.</p>";  
  117.         doc = Jsoup.parseBodyFragment(html, baseUri);  
  118.         System.out.println(doc);  
  119.         Element body = doc.body(); //獲取body元素,效果等同於doc.getElementsByTag("body")  
  120.         System.out.println("*******");  
  121.         System.out.println(body);  
  122.     }  
  123. }  


本文爲Eliot原創,轉載請註明出處:http://blog.csdn.net/xyw_eliot/article/details/9142865
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章