Jsoup 使用教程:輸入

使用背景:

  使用網絡爬蟲(或者手動複製),從別的網站上下載下來的內容,都是一堆的html,不少標籤、樣式 等等均可能是你所不須要的,或者 想要變成你想要的樣式。那麼該怎麼辦呢?html

  咱們知道,每個網頁都是一個html,那麼下載下來的內容則多是徹底或不徹底的html 片斷java

  使用Jsoup 能夠解析 htmlnode

正文:

一、解析一個HTML字符串

使用Jsoup 來解析一個HTML 文檔。使用靜態Jsoup.parse(String html) 方法或 Jsoup.parse(String html, String baseUri)示例代碼:web

String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

  其解析器可以盡最大可能從你提供的html 文檔 來建立一個乾淨的解析結果,不管html 的格式是否完整api

  好比它能夠處理:安全

    • 沒有關閉的標籤 (好比: <p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>)
    • 隱式標籤 (好比. 它能夠自動將 <td>Table data</td>包裝成<table><tr><td>?)
    • 建立可靠的文檔結構(html標籤包含head 和 body,在head只出現恰當的元素)

    parse(String html, String baseUri) 這方法可以將輸入的HTML解析爲一個新的文檔 (Document),參數 baseUri 是用來將相對 URL 轉成絕對URL,並指定從哪一個網站獲取文檔。cookie

  如這個方法不適用,你可使用 parse(String html) 方法來解析成HTML字符串如上面的示例。.網絡

  只要解析的不是空字符串,就能返回一個結構合理的文檔,其中包含(至少) 一個head和一個body元素。ide

  一旦擁有了一個Document,你就可使用Document中適當的方法或它父類 ElementNode中的方法來取得相關數據。post

 

一個文檔的對象模型

  • 文檔由多個Elements和TextNodes組成 (以及其它輔助nodes:詳細可查看:nodes package tree).
  • 其繼承結構以下:Document繼承Element繼承NodeTextNode繼承 Node.
  • 一個Element包含一個子節點集合,並擁有一個父Element。他們還提供了一個惟一的子元素過濾列表。

 

二、解析一個body片段

問題

假如你有一個HTML片段 (好比. 一個 div 包含一對 p 標籤; 一個不完整的HTML文檔) 想對它進行解析。這個HTML片段能夠是用戶提交的一條評論或在一個CMS頁面中編輯body部分。

辦法

使用Jsoup.parseBodyFragment(String html)方法.

String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();

 

說明

parseBodyFragment 方法建立一個空殼的文檔,並插入解析過的HTML到body元素中。假如你使用正常的 Jsoup.parse(String html) 方法,一般你也能夠獲得相同的結果,可是明確將用戶輸入做爲 body片斷處理,以確保用戶所提供的任何糟糕的HTML都將被解析成body元素。

Document.body() 方法可以取得文檔body元素的全部子元素,與 doc.getElementsByTag("body")相同。

保證安全Stay safe

假如你可讓用戶輸入HTML內容,那麼要當心避免跨站腳本攻擊。利用基於 Whitelist 的清除器和 clean(String bodyHtml, Whitelist whitelist)方法來清除用戶輸入的惡意內容。

 

三、從一個URL加載一個Document

存在問題

你須要從一個網站獲取和解析一個HTML文檔,並查找其中的相關數據。你可使用下面解決方法:

解決方法

使用 Jsoup.connect(String url)方法:

Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();

  

說明

connect(String url) 方法建立一個新的 Connection, 和 get() 取得和解析一個HTML文件。若是從該URL獲取HTML時發生錯誤,便會拋出 IOException,應適當處理。

Connection 接口還提供一個方法鏈來解決特殊請求,具體以下:

Document doc = Jsoup.connect("http://example.com")
  .data("query", "Java")
  .userAgent("Mozilla")
  .cookie("auth", "token")
  .timeout(3000)
  .post();

  

這個方法只支持Web URLs (httphttps 協議); 假如你須要從一個文件加載,可使用parse(File in, String charsetName) 代替。

 

四、從一個文件加載一個文檔

問題

在本機硬盤上有一個HTML文件,須要對它進行解析從中抽取數據或進行修改。

辦法

可使用靜態 Jsoup.parse(File in, String charsetName, String baseUri) 方法:

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

 

說明

parse(File in, String charsetName, String baseUri) 這個方法用來加載和解析一個HTML文件。如在加載文件的時候發生錯誤,將拋出IOException,應做適當處理。

baseUri 參數用於解決文件中URLs是相對路徑的問題。若是不須要能夠傳入一個空的字符串。

另外還有一個方法parse(File in, String charsetName) ,它使用文件的路徑作爲 baseUri。 這個方法適用於若是被解析文件位於網站的本地文件系統,且相關連接也指向該文件系統。

參考連接:

Jsoup 官網教程(英文)

Jsoup 中文教程

相關文章
相關標籤/搜索