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] 

 

posted @ 2021-05-23 16:47  timi小周  阅读(1072)  评论(0编辑  收藏  举报