有些时候,我们做APP时,也许会为没有相应的API而发愁。看到某些网站上某些内容很好,却没有办法获取到。最近,接触到了jsoup,用它就可以轻松获取到网站上的内容了。jsoup是什么呢?jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
- 从一个URL,文件或字符串中解析HTML;
- 使用DOM或CSS选择器来查找、取出数据;
- 可操作HTML元素、属性、文本。
jsoup官方文档:https://jsoup.org/cookbook/
中文文档:http://www.open-open.com/jsoup/
在Android Studio中直接在Gradle中加入以下依赖
compile ‘org.jsoup:jsoup:1.10.2’
然后,你就可以找到一个喜欢的网站去解析你想要的内容了。
下面简单说一下如何使用,因为自己之前听过,但是最近采用,把自己使用的一些心得写出来。
我们以泡在网上的日子的综合资讯栏目做一个例子。

在浏览器中点击查看网页源代码,查看整个网页的源代码。

可以看到,全都是标签。所以,最好懂一点点前端的知识,使用起来会更容易。下面来看简单的应用。
|
|
上面在Element element = document.select("div.col-md-9").first();最后接了一个first();方法,意思就是找出第一个class = div.col-md-9的div的那一项。然后,找到了class = div.col-md-9的div,也就找到了文章列表。所以,就要选择文章的详情。select("div.archive-detail")就会去找到div下的所有名字为archive-detail的div。用size()看一下有多少条数据。
看一下,打印的日志:
05-25 20:47:22.881 22784-22865/com.example.jsouptest D/MainActivity: 文章总数 15
没错,每一页最多15条数据。
|
|
最后的打印结果:
|
|
可以看到已经将文章解析出来了,第一条就是Java之父Gosling去亚马逊的事,哈哈。
其实,注释已经很清楚了。下面说一下使用的细节。
首先,要先找到你想要内容在网页源代码的位置。然后,就可以用Document对象进行
select("div.className")。当然,你也可以偷懒,直接就select(".className")也是一样可以的。其实,class并不一定要放div
标签的。假如,有这样的<article class="article-content">那你就要select("article.article-content")了,当然也可以select(".article-content")。不过不推荐偷懒的写法,毕竟以后看起来会好理解,学会变通吧。取值的过程中一定,先要选择
select()值外面的class,然后在attr("key")。这样就可以得到键key所对应的值value了。只想得到每一个纯文本,像上面的标题一样。
<h3><a href="/a/wangzhantuijian/waiwenfanyi/2017/0523/7968.html" title="Java 之父 James Gosling 宣布加入亚马逊 AWS" >Java 之父 James Gosling 宣布加入亚马逊 AWS</a></h3>。源代码是这个样子的。可以看到,标题横跨两个标签,这时可以select(“h3 a”)两个标签间以空格间隔。就选择了标题所在的标签。然后可以调用text()方法就会返回一个纯文本。和上面一样如果外面还包裹一个 div名字叫做article-detail 就要
select("div.article-detail h3 a")这样就可以选择到标题所在的节点了,这是一步到位。上面的文章中有些是有图片的,有些没有,我们在用时如果不处理,就会造成错误。因为,你解析出的文章数是15,而图片数是10。这样,你如果不处理,就会造成前十篇文章都有图片,但事实上前十篇文章有的不一定有图片。刚开始,我就是没处理,就一直报角标越界异常 ArrayIndexOutOfBoundsException 。因为在第十一篇文章时没有图片了,你还去试图访问自然就出问题了。所以我们不应该提前将每一个图片拿出来,我们应该根据索引加载对应文章的图片就行了。也就是
element.getElementsByIndexEquals(i)的作用。
这个问题在于文章的图片标签不在文章详情标签里,而是自己单独一个标签,所以我们应该按照索引去取。 上面的源代码有体现他们两者的位置。如果像要获得某一节点下的html代码,只需要调用
html()就能给你返回对应的html代码。假如网页文字是粗体显示的,你也想在APP中实现和网页一样的效果,你只要调用html(),然后就可以使用TextView.setText(Html.fromHtml(articleContent))。这样,就可以在Android显示粗体了。上面在去对应的链接过程中,有的直接在html中返回的是相对路径。这时,如果你想取到绝对路径。可以这样:
link.attr("abs:href"),就是在链接标签href前加上abs:。当然,不想自己拼接,也有对应的方法, Node.absUrl(String key))。
总结一下,使用方法:
- 找到心仪的网页
- 用Jsoup.connect()获取网页的document
- 查看网页源码,找到你想要的地方,使用Element.select(String
selector) - 用Node.attr(String key)或者Element.text()方法把数据抽出来
最后,不会的地方,要学会勤奋的去查文档,或者利用好Google。