Jsoup類
一、類結構
org.jsoup.Jsoup
public classJsoup
extends
Jsoup類來自於org.jsoup.Jsoup包,並且繼承自Object類。
二、方法
static String |
clean(String bodyHtml, String baseUri, Whitelist whitelist) |
static String |
clean(String bodyHtml, String baseUri, Whitelist whitelist, Document.OutputSettings outputSettings) |
static String |
clean(String bodyHtml, Whitelist whitelist) |
static Connection |
|
static boolean |
isValid(String bodyHtml, Whitelist whitelist) |
static Document |
parse(File in, String charsetName) |
static Document |
parse(File in, String charsetName, String baseUri) |
static Document |
parse(InputStream in, String charsetName, String baseUri) |
static Document |
parse(InputStream in, String charsetName, String baseUri, Parser parser) 讀取輸入流,解析成Document |
static Document |
|
static Document |
|
static Document |
parse(String html, String baseUri, Parser parser) |
static Document |
|
static Document |
parseBodyFragment(String bodyHtml) |
static Document |
parseBodyFragment(String bodyHtml, String baseUri) |
三、方法詳解
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>
實例:
- String html = "<p><ahref='http://www.baidu/' οnclick='stealCookies()'> 百度一下,你就知道 </a></p>";
- String doc = Jsoup.clean(html,Whitelist.basic());
- //輸出:<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建立連接,這個方法只支持http和https協議,連接的方式可以是get也可以是post,並且可以爲連接提供所需要的信息,如data、cookies、userAgent、method等。
實例:
- Document doc = Jsoup.connect("http://example.com")
- .userAgent("Mozilla").data("name","jsoup").get();
- Document doc = Jsoup.connect("http://example.com")
- .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。
實例:
- String html = "<p><ahref='http://www.baidu/'οnclick='stealCookies()'> 百度一下,你就知道 </a></p>";
- System.out.println(Jsoup.isValid(html, Whitelist.basic()));
- //輸出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設置無效,拋出異常。
實例:
- File file = new File("C://baidu.txt");
- 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設置無效,拋出異常。
實例:
- FileInputStream input = new FileInputStream("C://baidu.txt");
- Document doc = Jsoup.parse(input, "GBK", "http://www.baidu.com", Parser.htmlParser());
- System.out.println(doc);
- 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。
實例:
- String html = "<html><head><title>Firstparse</title></head>"
- + "<body><p>Parsed HTML into adoc.</p></body></html>";
- Document doc = Jsoup.parse(html,"www.baidu.com", Parser.htmlParser());
- 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 –連接或者讀取錯誤
實例:
- URL url = new URL("http://www.baidu.com");
- Document doc = Jsoup.parse(url,500);
- System.out.println(doc);
parseBodyFragment
public static Document parseBodyFragment(String bodyHtml, String baseUri)
將Html片段解析成body格式
參數:
bodyHtml
–Html片段
baseUri
-將html中相對路徑轉換爲絕對路徑的URL
返回值:
返回健全的html文檔
實例:
- String html = "<div><p>Loremipsum.</p>";
- Document doc = Jsoup.parseBodyFragment(html);
- 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 html, String baseUri, Parser parser)
還可以使用clean方法對html進行過濾,使用isValid方法判斷html是否符合過濾規則。
五、實例
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.net.URL;
- import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- import org.jsoup.parser.Parser;
- import org.jsoup.safety.Whitelist;
- public class Load {
- private static Document doc;
- private static String html;
- private static String url = "http://www.baidu.com";
- private static String baseUri = "http://www.baidu.com";
- public static Document getDoc() {
- return doc;
- }
- public static void setDoc(Document doc) {
- Load.doc = doc;
- }
- public static void main(String[] args){
- try {
- LoadHtml();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 設置代理服務器(ps:單位用的代理上網)
- */
- public static void Host(){
- System.getProperties().setProperty("proxySet", "true");
- //用的代理服務器
- System.getProperties().setProperty("http.proxyHost", "192.168.130.15");
- //代理端口
- System.getProperties().setProperty("http.proxyPort", "8848");
- }
- public static void LoadHtml() throws Exception{
- Host();
- JsoupClean();
- JsoupConnect();
- JsoupIsValid();
- JsoupParseFile();
- JsoupParseStream();
- JsoupParseStr();
- JsoupURL();
- JsoupBody();
- }
- /**
- * html過濾
- */
- public static void JsoupClean(){
- html = "<p><a href='http://blog.csdn.net/xyw_eliot' οnclick='stealCookies()'> Eliot </a></p>";
- String doc = Jsoup.clean(html, baseUri, Whitelist.basic());
- System.out.println(doc);
- }
- /**
- * 連接URL返回Document
- * @throws IOException
- */
- public static void JsoupConnect() throws IOException{
- doc = Jsoup.connect(url).get();
- System.out.println(doc);
- }
- /**
- * 判斷是否符合過濾規則
- */
- public static void JsoupIsValid(){
- html = "<p><a href='http://www.baidu/'οnclick='stealCookies()'> 百度一下,你就知道 </a></p>";
- System.out.println(Jsoup.isValid(html, Whitelist.basic()));
- }
- /**
- * 解析文件
- * @throws IOException
- */
- public static void JsoupParseFile() throws IOException{
- File file = new File("C://baidu.txt");
- doc = Jsoup.parse(file, "GBK", baseUri);
- System.out.println(doc);
- }
- /**
- * 解析流
- * @throws Exception
- */
- public static void JsoupParseStream() throws Exception{
- FileInputStream in = new FileInputStream("C://baidu.txt");
- doc = Jsoup.parse(in, "GBK", baseUri);
- System.out.println(doc);
- in.close();
- }
- /**
- * 解析字符串
- */
- public static void JsoupParseStr(){
- html = "<html><head><title>First parse</title></head>"
- + "<body><p>Parsed HTML into a doc.</p></body></html>";
- doc = Jsoup.parse(html, baseUri);
- System.out.println(doc);
- }
- /**
- * 解析URL
- * @throws Exception
- */
- public static void JsoupURL() throws Exception{
- URL url = new URL("http://www.baidu.com");
- doc = Jsoup.parse(url, 500);
- System.out.println(doc);
- }
- /**
- * 將html片段解析爲body格式
- */
- public static void JsoupBody(){
- html = "<div><p>Lorem ipsum.</p>";
- doc = Jsoup.parseBodyFragment(html, baseUri);
- System.out.println(doc);
- Element body = doc.body(); //獲取body元素,效果等同於doc.getElementsByTag("body")
- System.out.println("*******");
- System.out.println(body);
- }
- }
本文爲Eliot原創,轉載請註明出處:http://blog.csdn.net/xyw_eliot/article/details/9142865