android+jsoup解析html,Jsoup解析HTML获取数据

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

Jsoup

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

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

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

好了,现在该是得到数据的时候了。

【第一步】定位

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

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

所以我们真正需要解析的也就是每一个“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方法得到“暴力白菜”。 至此,我们的数据就已经获取完毕了,下面是运行的结果:

0818b9ca8b590ca3270a3433284dd417.png

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

小结

【注意】

因为这进行的网络操作,而android不允许在UI线程进行网络相关的操作,所以我们要新建一个线程来操作,还有别忘了添加相应的网络权限。

【补充】

其实解析HTML并不是很困难,主要是找到数据,然后解析数据,不同的只是解析数据的方法,在前面的代码中介绍了两种获取元素的方法:

getElementsByAttributeValue(String key , String value)

这个方法是根据传入的属性和属性值来得到相关的元素,返回值是Elements对象

getElementsByTag(String tag)

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值