Android Jsoup 爬取网页数据

一不小心一个月又过去了,其实最近还是小忙小忙的,废话不多说,直接进入今天的主题吧。

Jsoup -- Java HTML Parser, with best of DOM, CSS, and jquery.,看这个介绍就知道,这个就是方便咱们 JavaAndroid 来解析 HTML 的。

HTML 标签

要去爬别人的 HTML 标签的话,首先你肯定得有一定的 HTML 的基础知识吧。比如说常用的标签,标签的相关属性,这个就不多说了,有相关问题都可以在 www.w3school.com.cn 的网站解决一下。

加载网页

最简单的,直接加载一个网页:

  Document document = Jsoup.connect("https://www.google.com").get();

那看到最后的 get() 方法聪明滴你一定就猜到还有一个对应的 post() 方法了吧。另外,http 请求的相关操作都是可以设置的,包括 header 请求参数,请求超时等等。除此之外,本地的文件(IO流)等都是可以直接解析的哈。

Document document = Jsoup.connect("https://android-arsenal.com")
        .timeout(5000)
        .cookie("cookie", "cxxx")
        .header("xx", "xx")
        .userAgent("")
        .get();

基本标签解析

之后咱们就得到了一个 Document 的对象了。这个对象就是对整个请求网页的封装,相关内容都可以在里面获取。

来吧,加入我们有下面一段html标签需要解析:

A single adapter for the whole project.

  • Now you do not need to implement adapters for RecyclerView.
  • You can easily use several types of cells in a single list.
  • Using this library will protect you from the appearance of any business logic in an adapter.
Mar 17, 2017

Jsoup 里面对于标签的寻找使用的方法是 select() 方法,这个方法不要太强大了。咱们一步一步的来。

比如我们要在茫茫标签中找到

的话,拿这里就是应该 findElementByClass() ,那么在 Jsoup 中是怎么定义这一块的呢?

Android Jsoup 爬取网页数据_第1张图片
Jsoup-selector.png

哈哈,很easy嘛,那就是 document.select("div.project-info clearfix") 咯,当然不是这样子的,等等 class 属性里面这个空格是什么意思啊?是不是一脸懵逼?这里最终的写法是 document.select("div.project-info.clearfix") 空格需要用 . 来处理。

      Elements select = document.select("div.project-info.clearfix");

这里得到是一个集合。我们接下来就需要遍历这个集合,然后把里面的每一个标签都拔出来。

title 部分的解析,这里是一个

里面嵌套了一个 的标签。这里就涉及到了解析 标签了。这里我们需要对应的 href,也需要对应的 textJsoup 提供了对应的两个方法 attr()text()

Elements elements = e.select("div.title");
if (!elements.isEmpty()) {
    for (Element tittle : elements) {
        Element first = tittle.select("a[href]").first();
        if (first != null) {
            title = first.text();
            titleUrl = first.attr("href");
            System.out.println("名称:" + title);
            System.out.println("具体地址:" + titleUrl);
        }

        Elements select1 = tittle.select("a.tags");
        if (!select1.isEmpty()) {
            tag = select1.text();
            tagUrl = select1.attr("href");
            System.out.println("tags:" + tag);
            System.out.println("tagUrl:" + tagUrl);
        }
    }
}   

嵌套解析

到这里,

标签的介绍基本搞定,接下来就是
的解析了。

A single adapter for the whole project.

  • Now you do not need to implement adapters for RecyclerView.
  • You can easily use several types of cells in a single list.
  • Using this library will protect you from the appearance of any business logic in an adapter.

这里又多了

  • 了,其实道理是差不多的,但是这里它们既没有 class 也没有 id ,那这个我们应该这么去解析呢?

    这里还是要回到 select() 方法,这里就需要使用到指定层级的方法了。

    嵌套解析.png
            Elements select1 = e.select("div.desc > p");
            String s = select1.toString();
    

    对于

    相关的标签,就可以使用 + 相关的连接符了。例如我想要只解析 Tag 下面的对应的 Tag 名称和相关的 url,这个应该怎么写呢?

    Tag
    Background Processing
    License
    Apache License, Version 2.0

    代码就是这样的,这里一不小心就又引出了 select() 方法的嵌套高级写法。

     Elements select4 = element.select("dt:contains(Tag) + dd");
    
    Android Jsoup 爬取网页数据_第3张图片
    select-高级.png

    其实不用太多解释啦,截图里面描述的很清楚了。最后一个是可以支持正则的匹配。

    同级相邻解析

    还有一种情况就是我们需要的标签没有具体的 id 或者 class,并且它没有直接对应的父标签或者某种固定的嵌套关系,例如下面这种情况:

     
    ImmediateLooperScheduler 

    这里我们只需要解析到第二个 标签,那么需要怎么处理呢?这里就需要使用到 nextElementSibling() 的方法了。

    Element ssa = h1.select("a#favoriteButton").first();
    Element element = ssa.nextElementSibling();
    String title = element.text();
    

    模糊解析

    属性限制.png

    有时候我们只知道这个

    是以 什么开头或者是以什么结尾或者又是里面包含了某个单词的,那么这个时候就需要使用模糊查找了。

    Jsoup 中定义了这些情况的相关 select() 写法,其中,以什么开头,是使用 a[href^=http] ,以什么结尾使用 a[href$=.jpg] ,包含什么就是使用 a[href*=/search/]

    javascript 解析

    刚刚说的都是普通标签及其内容,如果我要获取js相关的标签以及内容呢?其实也不难,只是最后不是使用text()的方法,而是使用data()的方法了。

    就是 Jsoup 最主要的就是写好这个 select() 方法,

    final Elements script = document.select("script");
    
    String js = script.first().data();
    

    相关实战

    Android-Arsenal 这个网站不造大家伙儿有听说过没?这里给我们Android开发者提供了了一个信息交流展示平台,实时更新一些Android相关的App,开发库、以及Demo。然后,我看到它也有自己的客户端,所以一时好奇也打算下载下来看看,结果,客户端就是直接加载的网页,关键是广告满天飞。这个就让人不好受了(话说回来,人家不打广告赚点儿钱做这个平台干嘛呢。)

    所以灵机一动,为什么我不自己搞一个 Android-Arsenal 的客户端呢?这样方便在手机上看到最新的东西嘛。所以就做了一个客户端,而使用的就是Jsoup 来爬去的对应的网页。然后就把对应 ads 的标签都过滤了,所以是很清爽的啦。当然功能也只是先实现了一部分。喜欢的朋友可以点个星星或者下载使用哟!

    最后来一波效果图:

    项目地址:https://github.com/lovejjfg/Android-Arsenal

    Android Jsoup 爬取网页数据_第5张图片
    1.jpg
    Android Jsoup 爬取网页数据_第6张图片
    2.jpg
    Android Jsoup 爬取网页数据_第7张图片
    3.jpg
    Android Jsoup 爬取网页数据_第8张图片
    4.jpg
    Android Jsoup 爬取网页数据_第9张图片
    5.jpg
    Android Jsoup 爬取网页数据_第10张图片
    6.jpg

    ---- Edit By Joe At 2017 03 18 ----

你可能感兴趣的:(Android Jsoup 爬取网页数据)