要件
- webから直接情報を取得する(api等は用意しない)
Jsoupとは
https://github.com/jhy/jsoup
htmlを取得してjQueryっぽく要素にアクセスできるライブラリです。サイト上のhtmlまるごと取得するので自前APIに比べ決して早くは無いですが、簡単なアプリでwebから情報を取得する場合はこれで十分だなと思いました。
URLからHTMLを取得する
val document = Jsoup.connect("サイトのURL").get()
取得したHTMLから要素を指定する
色々APIはありますが、.select
で大概のことが出来ます。※list形式で取得されるので使用する際はindexを指定する必要があります
タグ指定の場合
document.select("タグ名").first().text()
ID指定の場合
document.select("#ID名").first().text()
クラス指定の場合
document.select(".クラス名").first().text()
属性の値を取得したい場合
document.select("タグ名").first().attr("abs:属性名").`val`()
サンプルコード
Qiitaのトップページから、最初の記事のURLを取得してみたいと思います。
data class QiitaItem(
var url: String
) {
companion object {
fun getUrl(): Single<QiitaItem> {
return Single.create<Document> {
val document = Jsoup.connect("https://qiita.com/trend").get()
it.onSuccess(document)
}.flatMap {
val cell = it.select(".p-home_main .tr-ItemList .tr-Item").first()
val url = cell.select("tr-Item_title").first().attr("abs:href")
Single.just(QiitaItem(url))
}.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
}
}
}
QiitaItem.getUrl().subscribe(object : DisposableSingleObserver<QiitaItem>() {
override fun onSuccess(data: QiitaItem) {
Log.d("url", data.url)
}
override fun onError(e: Throwable) {
Log.e("error", e.toString())
}
})