手把手教學(xué)Android用jsoup解析html實(shí)例
1.jsoup介紹
很多時(shí)候,我們需要從各種網(wǎng)頁上面抓取數(shù)據(jù),而jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。
jsoup官方文檔:https://jsoup.org/cookbook/
2.使用場(chǎng)景
下面是一張關(guān)于美食的截圖,可以留意到這是一個(gè)html網(wǎng)頁,當(dāng)我們想要抓取里面的數(shù)據(jù)的時(shí)候,jsoup就能幫到我們很多。
接下來開始手把手教學(xué)
首先,也是很重要的一步,就是下載jar包,丟到libs里面
jar包下載地址:http://jsoup.org/download
Android studio玩家可以不下載jar包,在Gradle里面加入
dependencies { compile 'org.jsoup:jsoup:1.9.2' }
然后,找到你心儀的網(wǎng)頁去抓取數(shù)據(jù)
這里我們我繼續(xù)使用美食的網(wǎng)頁,然后右鍵查看網(wǎng)頁源碼,或者按F12,接下來可以看到一大堆標(biāo)簽:
找到需要的,例如上圖這個(gè) “美食天下” ,可以看到 “美食天下” 是放在以 <div class="top-bar" id="J_top_bar"> 為節(jié)點(diǎn)的 <a title="美食天下" 中,要獲取這個(gè)“美食天下”,代碼可以這樣寫:
try { //從一個(gè)URL加載一個(gè)Document對(duì)象。 Document doc = Jsoup.connect("http://home.meishichina.com/show-top-type-recipe.html").get(); //選擇“美食天下”所在節(jié)點(diǎn) Elements elements = doc.select("div.top-bar"); //打印 <a>標(biāo)簽里面的title Log.i("mytag",elements.select("a").attr("title")); }catch(Exception e) { Log.i("mytag", e.toString()); }
接下來看一下打印出來的結(jié)果:
Jsoup.connect(String url)方法從一個(gè)URL加載一個(gè)Document對(duì)象。如果從該URL獲取HTML時(shí)發(fā)生錯(cuò)誤,便會(huì)拋出 IOException,應(yīng)適當(dāng)處理。
一旦擁有了一個(gè)Document,你就可以使用Document中適當(dāng)?shù)姆椒ɑ蛩割?Element和Node中的方法來取得相關(guān)數(shù)據(jù)。
public class Element extends Node public class Document extends Element
很多文章都是說一大堆原理然后放出一個(gè)簡(jiǎn)單的例子,就跟我上面簡(jiǎn)單的打了一個(gè)log一樣,然后發(fā)現(xiàn)用起來的時(shí)候是沒那么簡(jiǎn)單的。為了大家能不看文檔也可以直接使用(并且看不懂那一大堆標(biāo)簽也可以用),我決定再舉一個(gè)例子(其實(shí)也就是比上面多打幾個(gè)log):
下圖紅色框框是我們要獲取的數(shù)據(jù),可以看到他們對(duì)應(yīng)的節(jié)點(diǎn)就是藍(lán)色圓圈里面的<div class="xxx">
廢話不多說上代碼
try { //還是一樣先從一個(gè)URL加載一個(gè)Document對(duì)象。 Document doc = Jsoup.connect("http://home.meishichina.com/show-top-type-recipe.html").get(); //“椒麻雞”和它對(duì)應(yīng)的圖片都在<div class="pic">中 Elements titleAndPic = doc.select("div.pic"); //使用Element.select(String selector)查找元素,使用Node.attr(String key)方法取得一個(gè)屬性的值 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>標(biāo)簽里面 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"); //對(duì)于一個(gè)元素中的文本,可以使用Element.text()方法 Log.i("mytag", "burden:" + burden.get(1).text()); }catch(Exception e) { Log.i("mytag", e.toString()); }
大功告成,接下來看看log
沒有問題!那么教學(xué)可以結(jié)束了!
注意:
Jsoup.connect(String url)方法不能運(yùn)行在主線程,否則會(huì)報(bào)NetworkOnMainThreadException
最后上一張應(yīng)用在項(xiàng)目的效果圖:
有沒有發(fā)現(xiàn)熟悉的椒麻雞?很酷炫有木有!
小結(jié)
整堂課分幾步:
1.下載jar包并丟到libs(或者在gradle)
2.找到心儀的網(wǎng)頁
3.用Jsoup.connect()獲取網(wǎng)頁的document
4.查看網(wǎng)頁源碼,對(duì)準(zhǔn)你想要的地方,給他來一個(gè)Element.select(String selector)
5.用Node.attr(String key)或者Element.text()方法把數(shù)據(jù)抽出來
6.沒有6了就是這么簡(jiǎn)單!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Activity透明/半透明效果的設(shè)置transparent(兩種實(shí)現(xiàn)方法)
兩種方法實(shí)現(xiàn)Activity透明/半透明效果的設(shè)置,代碼思路很有調(diào)理,感興趣的朋友可以參考下,希望本文可以幫助到你2013-02-02Android定時(shí)器和Handler用法實(shí)例分析
這篇文章主要介紹了Android定時(shí)器和Handler用法,實(shí)例分析了Android中的定時(shí)器與Handler相關(guān)使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Android實(shí)現(xiàn)APP歡迎頁面簡(jiǎn)單制作思路
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)APP歡迎頁面簡(jiǎn)單制作思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08android中Intent傳值與Bundle傳值的區(qū)別詳解
本篇文章是對(duì)android中Intent傳值與Bundle傳值的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05a2sd+狀態(tài)下應(yīng)用程序丟失的解決方法詳細(xì)解析
用了a2sd+和SD分區(qū)方案的朋友可能會(huì)遇到突然某次開機(jī)之后,a2sd+失效,同時(shí)發(fā)生丟失若干應(yīng)用程序的現(xiàn)象或者安裝軟件提示空間不足2013-09-09Android 自定義 View 中使用 Spannable的實(shí)例詳解
這篇文章主要介紹了Android 自定義 View 中使用 Spannable的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Android Studio 超級(jí)簡(jiǎn)單的打包生成apk的方法
本篇文章主要介紹了Android Studio 超級(jí)簡(jiǎn)單的打包生成apk的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android OnCreate()中獲取控件高度與寬度兩種方法詳解
這篇文章主要介紹了Android OnCreate()中獲取控件高度與寬度兩種方法詳解的相關(guān)資料,這里提供了兩種方法,大家可以都看下,需要的朋友可以參考下2016-12-12