有時候可能咱們會有這樣的需求,拿到一個url連接,而後獲取到裏面的數據,再轉換成原生來實現這個html頁面。實現要解析html,應該和xml解析相似,先獲取標籤,再對標籤裏面的內容進行解析,一層層嵌套。 Jsoup用法: 1.在工程gradle中allprojects中加入下面這句話html
maven { url "https://jsoup.org/" }
複製代碼
2.在項目gradle中引入android
" api 'org.jsoup:jsoup:1.12.1'"
複製代碼
目前最新版本就是1.12.1,這樣就能夠在項目中引用jsoup了。 這裏咱們用簡書首頁文章列表爲例: 打開簡書首頁,在頁面上右鍵,打開源碼頁面,咱們首先來分析一下簡書的源碼, api
經過觀察能夠知道文章列表是放在id爲list-container的div標籤下面,而後再繼續往下看,發現每一個item是由Observable.create<Document> {
val doc = Jsoup.connect("https://www.jianshu.com/").get()
it.onNext(doc)
it.onComplete()
}.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
val elements = it.select("div#list-container ul li")
for (element in elements) {
LogUtils.d(
"element_tittle=${element.select("div.content a").text()}\n" +
"content=${element.select("div.content p").text()}\n" +
"簡書鑽=${element.select("div.content div.meta span.jsd-meta").text()}\n" +
"做者=${element.select("div.content div.meta a").text()}\n" +
"圖片=https:${element.select("a.wrap-img img").attr("src")}"
)
}
}
複製代碼
經過Jsoup.connect()方法能夠將url連接轉換成一個Document的對象,這裏要注意一點,這個方法必定要異步請求,不能再主線程中進行,由於這裏至關於一個網絡請求,android裏面是不能再主線程中處理網絡請求的。我這裏使用了RxJava進行了線程的轉換。下面訂閱成功返回後解析Document的對象,具體語法能夠參考 jsoup官網:jsoup.org/ jsoup中文網:www.open-open.com/jsoup/ 上面代碼運行後,打印出來結果見下圖: bash
能夠很清楚的看到咱們已經拿到簡書列表item裏面的全部數據,這樣就能夠直接展現在咱們RecycleView中了。