手把手教學Android用jsoup解析html例項

手把手教學Android用jsoup解析html例項

1.jsoup介紹

很多時候,我們需要從各種網頁上面抓取資料,而jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文字內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和運算元據。

jsoup官方文件:https://jsoup.org/cookbook/

2.使用場景

下面是一張關於美食的截圖,可以留意到這是一個html網頁,當我們想要抓取裡面的資料的時候,jsoup就能幫到我們很多。

接下來開始手把手教學

首先,也是很重要的一步,就是下載jar包,丟到libs裡面

jar包下載地址:http://jsoup.org/download

Android studio玩家可以不下載jar包,在Gradle裡面加入


dependencies {
compile 'org.jsoup:jsoup:1.9.2'
}

然後,找到你心儀的網頁去抓取資料

這裡我們我繼續使用美食的網頁,然後右鍵檢視網頁原始碼,或者按F12,接下來可以看到一大堆標籤:

找到需要的,例如上圖這個 “美食天下” ,可以看到 “美食天下” 是放在以 <div class=”top-bar” id=”J_top_bar”> 為節點的 <a title=”美食天下” 中,要獲取這個“美食天下”,程式碼可以這樣寫:


try {  
//從一個URL載入一個Document物件。
Document doc = Jsoup.connect("http://home.meishichina.com/show-top-type-recipe.html").get();
//選擇“美食天下”所在節點
Elements elements = doc.select("div.top-bar");  
//列印 <a>標籤裡面的title
Log.i("mytag",elements.select("a").attr("title"));
}catch(Exception e) {  
Log.i("mytag", e.toString());
}

接下來看一下列印出來的結果:

Jsoup.connect(String url)方法從一個URL載入一個Document物件。如果從該URL獲取HTML時發生錯誤,便會丟擲 IOException,應適當處理。

一旦擁有了一個Document,你就可以使用Document中適當的方法或它父類 Element和Node中的方法來取得相關資料。


public class Element extends Node
public class Document extends Element

很多文章都是說一大堆原理然後放出一個簡單的例子,就跟我上面簡單的打了一個log一樣,然後發現用起來的時候是沒那麼簡單的。為了大家能不看文件也可以直接使用(並且看不懂那一大堆標籤也可以用),我決定再舉一個例子(其實也就是比上面多打幾個log):

下圖紅色框框是我們要獲取的資料,可以看到他們對應的節點就是藍色圓圈裡面的<div class=”xxx”>

廢話不多說上程式碼


try {  
//還是一樣先從一個URL載入一個Document物件。
Document doc = Jsoup.connect("http://home.meishichina.com/show-top-type-recipe.html").get();
//“椒麻雞”和它對應的圖片都在<div class="pic">中
Elements titleAndPic = doc.select("div.pic");
//使用Element.select(String selector)查詢元素,使用Node.attr(String key)方法取得一個屬性的值
Log.i("mytag", "title:"   titleAndPic.get(1).select("a").attr("title")   "pic:"   titleAndPic.get(1).select("a").select("img").attr("data-src"));
//所需連結在<div class="detail">中的<a>標籤裡面
Elements url = doc.select("div.detail").select("a");
Log.i("mytag", "url:"   url.get(i).attr("href"));
//原料在<p class="subcontent">中
Elements burden = doc.select("p.subcontent");
//對於一個元素中的文字,可以使用Element.text()方法
Log.i("mytag", "burden:"   burden.get(1).text());
}catch(Exception e) {  
Log.i("mytag", e.toString());
}

大功告成,接下來看看log

沒有問題!那麼教學可以結束了!

注意:

Jsoup.connect(String url)方法不能執行在主執行緒,否則會報NetworkOnMainThreadException

最後上一張應用在專案的效果圖:

有沒有發現熟悉的椒麻雞?很酷炫有木有!

小結

整堂課分幾步:

1.下載jar包並丟到libs(或者在gradle)

2.找到心儀的網頁

3.用Jsoup.connect()獲取網頁的document

4.檢視網頁原始碼,對準你想要的地方,給他來一個Element.select(String selector)

5.用Node.attr(String key)或者Element.text()方法把資料抽出來

6.沒有6了就是這麼簡單!