zoukankan      html  css  js  c++  java
  • 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] 

  • 相关阅读:
    MindMup 是一个开源的、在线的、简单的思维导图工具
    那些年我们用过的Python代码
    我心目中要求不高的理想团队
    与雨林再辩科学、宗教和道
    MySQL(一) 数据表数据库的基本操作
    hibernate(六) cascade(级联)和inverse关系详解
    java虚拟机内存区域的划分以及作用详解
    MySQL(二) 数据库数据类型详解
    MySQL(三) 数据库表的查询操作【重要】
    MySQL(四) 数据表的插入、更新、删除数据
  • 原文地址:https://www.cnblogs.com/timipaul/p/14801476.html
Copyright © 2011-2022 走看看