Android kotlin jsoup解析网页html代码
项目中需要使用网页数据,通过网页地址获取html,从中获取所需要的数据,进行展示
第一步,通过网络请求获取html代码
使用 jsoup获取html代码,并转换成Document
//jsoup插件 implementation 'org.jsoup:jsoup:1.10.3' //请求网址,返回document 内容节点 val doc: Document = Jsoup.connect("www.baidu.com").get()
使用的okhttp网络请求框架
val okHttpClient = OkHttpClient() //创建单例 val requestBuilder = Request.Builder()
Thread {
//以下可以抽离出放到方法中 val request : Request = requestBuilder.url("www.baidu.con").build() val response = okHttpClient.newCall(request).execute() //执行请求 //str 就是返回的html代码 val str = response.body!!.string() response.body!!.close()
//把字符串内容转换成Document节点内容 val doc : Document = Jsoup.parse(str)
}.start()
获取内容列表节点
/* html代码 <div class="content"> <img id="meimg" src="www.*******.png" /> <a class="button" href="www.*******.com">点击跳转</a> <span class="titile">快乐学习</span> <ul> <li><span class="name">龙争虎斗</span></li> <li><span>斗罗大陆</span></li> </ul> </div> */ //通过网页节点获取,div,ul,li等html节点都可以,这里获取class名字是content的div val list: Elements = doc.select("div[calss=content]") //迭代器循环输出Elements 获取内容,图片地址等 for (index in list.indices) { var element = list[index] //获取文本内容 var title_text = element.select("div[class=title]").text()
//多层级获取文本内容 符号">" 表示下一层 var name_text = element.select("ul > li > div[class=name]").text()
//获取子节点内容 斗罗大陆,节点都可以适用 如 div:nth-child(1) var text = element.select("ul > li:nth-child(2)" > span).text()
//获取图片地址 通过attr() 获取,也可以获取其它属性 var img_url = element.select("img[id=meimg] ").attr("src")
//获取链接地址 var a_href = element.select("a[class=button]").attr("href") }
网页数据都能拿到了,是不是很简单
遇到过的问题
1. 抓取H5版本页面数据
正常抓取的是网页的数据,如果网站源有H5版和网页版,需要添加网络请求头
Jsoup.connect("url").header("key","value").get()
//okhttp 添加请求头
val requestBuilder = Request.Builder() val okHttpClient = OkHttpClient() requestBuilder.header(key,value) val request : Request = requestBuilder.url(url).build() val response = okHttpClient.newCall(request).execute()
2. 获取到的节点内容过多,获取到了不需要的节点数据
如果是获取 div[class=content],如果有多个div的class是content。 这样可能会获取到多个,有id尽量获取id div[id=content]