Jsoup解析HTML获取数据

来源:互联网 发布:云端软件 知乎 编辑:程序博客网 时间:2024/06/05 20:09

前言

  当进行和网络相关的开发,我们总是希望能够有API接口供我们调用,但是有时候我们并不是总能够找到API,就像我之前在做在线音乐播放器的时候,找百度的API接口就找了好长的时间,如果没有API的时候那么我们该怎么做呢?没错,我们可以直接解析HTML页面,从中得到我们的数据,而今天我给大家介绍的就是一个非常好用的框架:Jsoup

实现

  首先我们必须要知道从那里看到HTML的数据,这里我以笔趣阁网站为例,带大家获取数据。首先我们打开笔趣阁的网站,如下:


 没错,我们就要获取上图做标记的框框里面的数据,我们打开网站之后,右键选择“审查元素”,如下:


 选择【审查元素】之后,我们就可以得到下面的界面:

  可以看到,在这里我们找到了需要的数据,那么重头戏来了,该怎么解析HTML呢?其实很简单,和解析XML很是相似,如果对XML的解析没有概念的话,那么去看这篇文章可能就有点吃力了,建议先去看看XML的解析。
好了,现在该是得到数据的时候了。

【第一步】定位
  为什么要定位呢?这个就不用说了,不找到数据怎么解析呢?按照层次来找的话,应该是这样的:


  其中的每一个”li”就是对应的列表数据,而每一个”li”又包含下面的元素:


  所以我们真正需要解析的也就是每一个“li”里面的数据就可以了。
  现在我们已经成功了第一步,接下来就是Jsoup露脸的时候了。

【第二步】获取元素
  既然已经找到了每一个”li”那么该怎么下手去解析它呢?
  那就先来一段代码吧:

        String url = "http://www.biquge.la/xuanhuanxiaoshuo/";        try {            Document doc = Jsoup.connect(url).get();            if(doc!=null){                Elements es = doc.getElementsByAttributeValue("class","r").first().getElementsByTag("li");            }        }catch(Exception e){}
  可以看到,我们先找到那个HTML页面的url,然后我们调用Jsoup的静态方法connect接着调用get方法,此时返回一个Document对象,该Document对象代表的就是当前HTML数据对象,然后我们调用getElementsByAttributeValue方法,这个方法是很据属性和属性值来找相应的标签元素,代码中传入的是“class”和“r”,那么我们就知道了,它是从第三层级就开始找了,因为getElementsByAttributeValue方法返回的是Elements,它代表的是多个标签元素的集合,所以执行完getElementsByAttributeValue方法之后就调用first方法来得到第一个元素之后紧接着就调用getElementsByTag方法,该方法返回的也是Elements对象,因为传入的是“li”,所以此时Elements对象里面就是包含所有“li”标签的元素,所以我们有成功的得到了所有的“li”,第二步已经完成了。【第三步】获取数据  既然得到了所有的“li”元素,那么我们只需要对每一个“li”元素进行解析就可以得到我们最终的数据了,因为每一个“li”里面是如上的数据,所以方法和得到“li”标签相似,再来一段代码:
                        StringBuilder sb = new StringBuilder();                        for (Element element : es) {                            Element ele  = element.getElementsByAttributeValue("class","s5").first();                            String author = ele.text();                            Element link = element.getElementsByTag("a").first();                            String href = link.attr("href");                            String name = link.text();                            sb.append(author + " ");                            sb.append(name+" "+href).append("\n");                        }
  每一个“li”里面包含两个“span”
  element.getElementsByAttributeValue(“class”,”s5”);
  这行代码得到的就是第二个“span”
  String author = ele.text();
  然后调用text方法就可以得到“鬼屋夜游”这个字符串保存到author中。  element.getElementsByTag(“a”).first();
  这行代码得到的是第一个”span“里面的“a”标签元素,因为返回的Elements对象,所以要调用first方法来返回Element对象,此时返回的Element对象就是“a”标签对象。因为“href”是标签“a”的属性,所以呀调用attr方法来得到属性值“/book/9280”,然后调用text方法得到“暴力白菜”。至此,我们的数据就已经获取完毕了,下面是运行的结果:

  可以看到三个数据我们都已经获取完毕了,大功告成,(^__^) 嘻嘻……!

小结

【注意】
  因为这进行的网络操作,而android不允许在UI线程进行网络相关的操作,所以我们要新建一个线程来操作,还有别忘了添加相应的网络权限。
【补充】
  其实解析HTML并不是很困难,主要是找到数据,然后解析数据,不同的只是解析数据的方法,在前面的代码中介绍了两种获取元素的方法:

  • getElementsByAttributeValue(String key , String value)
    这个方法是根据传入的属性和属性值来得到相关的元素,返回值是Elements对象

  • getElementsByTag(String tag)
    这个方法是根据标签来得到元素,比如我们传入标签“li”,那么返回的就是包含所有“li”的Elements对象

  • getElementById(String id) 这是我要说明的第三种方法,根据id来得到元素,可以知道我们最初的“div”标签的id是“main”,所以我们传入“main”参数的话得到的就是最开始的标签元素

  我们可以根据自己的需要选择不同的方法,只要能解析出来,怎么使用都是可以的。

源码下载

1 0
原创粉丝点击