[Android] Jsoup 網頁內容擷取函式庫

Jsoup 是一款相當知名的 Java 函式庫,許多開發者常使用它來擷取網頁的資料。以往將  Jsoup 使用在 Android 應用程式上,會有效能上的問題,網頁擷取速度不快,偶爾會遇到頁面阻塞的狀況。然而在 1.8.3 版本的釋出之後,大幅改善 Android 效能的問題,依照 Jsoup 官網的說法,新版本大幅改善 HTML 頁面擷取的效能,在Android 4.4 上測試比舊版快1.7倍,Android 5.x則快了1.3倍。

在 Jsoup 官網的 Cookbook,有幾個使用上的範例,寫的淺顯易懂,建議大家在使用之前,可以先看過一遍。

Jsoup 本身即提供 HTTP client,但建議使用支援 Android 的高效 HTTP 客戶端(例如 Volleyokhttp)來取得網頁HTML檔, 再將 HTML 檔以字串的方式送交 Jsoup 擷取網頁資料。

Parse HTML 內容

以下是簡單的擷取內容範例,由第三行將HTML字串導入 Jsoup 來 parse。第四行擷取title這個HTML tag 的內容。

Jsoup 的語法參考了 CSS Selector,可以輕易的由 DOM 結構中,取得所需的資料。例如下面的例子,取得連結的文字,如擷取後回傳多筆資料,預設會全部以字串方式顯示,若只要顯示第一筆,則可比照第五行的方式,以 get(0) 取得第一筆資料。
若想做更多的測試或練習,可到Jsoup官網的測試頁面 http://try.jsoup.org/

白名單

另一個好用的功能是白名單,某些網站的網頁寫的很糟,裡面混雜 CSS 和JavaScript,HTML Tag也用的亂七八糟,使用白名單可以在 HTML 字串中,挑選需要擷取的 HTML Tag 為
白名單,其餘的內容就會自動過濾掉。以下的例子,第一行 Whitelist.basic 是預設方法,擷取基本 HTML Tag 加上圖片,以Jsoup的API Doc所述,basic包括這些 Tag : a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, span, strike, strong, sub, sup, u, ul。指定白名單之後,再使用第二行的 clean 方法將需要的資料擷取出來。
如果要自訂白名單 Tag,可以參考以下範例,這個例子只擷取表格和圖片。

以往擷取網頁資料,如果沒有函式庫的幫助,往往要寫一堆程式爬 DOM 結構,才能得到需要的資料,有了Jsoup的加持,爬網頁就簡單多了。受Jsoup的啟發,C#也有類似的函式庫,名為NSoup




相關文章

如何將電腦畫面經由 Chromecast 投放到電視螢幕上

Chrome 的檔案續傳功能

Mac與Android裝置傳輸檔案的方法

使用 Vysor 在電腦上控制 Android 裝置