Android 使用Jsoup解析HTML

3,591 阅读6分钟

前言

本文主要是讲jsoup爬取网页上的数据用法,具体介绍请看:

安装

as用户可直接依赖

implementation org.jsoup:jsoup:1.11.1

其他用户请看 jsoup.org/download

使用

下面的html来自干货集中营,就先以这个为例:

获取Document对象

Document对象可以看成一个一个HTML文档。

// 连接提供了一个方便的接口来从web获取内容,并将它们解析为文档
final Connection connect = Jsoup.connect("http://gank.io/xiandu/");
// 伪装成浏览器抓取,具体有没用布吉岛。。
connect.header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:32.0) Gecko/20100101 Firefox/32.0");
// 通过get()获取一个Document对象
final Document document = connect.get();

获取HTML head内容

head.png

我们想获取网页的标题,可以直接通过:

String title = document.head().select("title").text();
System.out.println(title);

输出:「读那些值得读的」

获取HTML body内容

前面的是不是感觉很简单,现在这个虽然复杂了一点,但是逻辑理清楚了,自然就简单很多了

<div class="typo">
    <div class="container content">

    <style>
        <!-- 省略部分html --!>
    </style>

    <h3 class="center"> 闲读 </h3>
    <p class="center" style="color: #747474;">
        读那些值得读的
    </p>

    <div id="xiandu_cat">
    <ul>
        <li><a style="border: 1px solid #747474;" href="/xiandu">科技资讯</a></li>
        <li><a href="/xiandu/apps">趣味软件/游戏</a></li>
        <li><a href="/xiandu/imrich">装备党</a></li>
        <li><a href="/xiandu/funny">草根新闻</a></li>
        <li><a href="/xiandu/android">Android</a></li>
        <li><a href="/xiandu/diediedie">创业新闻</a></li>
        <li><a href="/xiandu/thinking">独立思想</a></li>
        <li><a href="/xiandu/iOS">iOS</a></li>
        <li><a href="/xiandu/teamblog">团队博客</a></li>
     </ul>
     <!-- 省略部分html --!>
    </div>
    <!-- 省略大部分html --!>
</div>
  • 获取三级标题
String title = document.body().select("div.typo").select("div.container").select("h3.center").text();
System.out.println(title);

输出: 闲读
  • 获取li标签中的值
// <div class="container content">两个类随便选一个就行,这应该是js知识。。
Elements typoElements = document.body().select("div.typo").select("div.container");
// 多个select()拼接可以用空格隔开
Elements catsLi = typoElements.select("div#xiandu_cat ul li");

遍历div标签,如果里面有class属性,可以用 "div.typo" 定位,如果是id属性,可以用"div#xiandu_cat",其实省略div标签名也可以,最好还是加上。

for (Element element : catsLi) {
    String href = element.select("a").attr("href");
    String text = element.text();
    System.out.println(href + "\t" + text);
}

输出:/xiandu  科技资讯
     /xiandu/apps   趣味软件/游戏
     /xiandu/imrich 装备党
     /xiandu/funny  草根新闻
     /xiandu/android    Android
     /xiandu/diediedie  创业新闻
     /xiandu/thinking   独立思想
     /xiandu/iOS    iOS
     /xiandu/teamblog   团队博客
  • 获取内容
    1
Elements itemElements = typoElements.select("div.xiandu_items div.xiandu_item");
for (Element element : itemElements) {
    Elements leftElements = element.select("div.xiandu_left");
    // 编号,1:
    String no = leftElements.select("span.xiandu_index").text();
    // 跳转网址,http://daily.zhihu.com/story/9657300?utm_source=gank.io%2Fxiandu&utm_medium=website
    String url = leftElements.select("a").attr("href");
    // 内容,想精想怪 90——吃鸡手游化那些事
    String desc = leftElements.select("a").text();
    // 时间,8 分钟前
    String date = leftElements.select("span small").text();

    Elements rightElements = element.select("div.xiandu_right");
    // 来源url,/xiandu/view/zhihu
    String sourceUrl = rightElements.select("a.site-name").attr("href");
    // 来源名称,知乎日报
    String sourceTitle = rightElements.select("a.site-name").attr("title");
    // 来源图标,http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
    String sourceIcon = rightElements.select("a.site-name img").attr("src");
    System.out.println(no + "\t" + url + "\t" + desc + " \t" + date + "\t" + sourceUrl + "\t" + sourceTitle + "\t" + sourceIcon);
}

输出:
1:  http://daily.zhihu.com/story/9657300?utm_source=gank.io%2Fxiandu&utm_medium=website 想精想怪 90——吃鸡手游化那些事   15 分钟前  /xiandu/view/zhihu  知乎日报    http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
2:  http://daily.zhihu.com/story/9656949?utm_source=gank.io%2Fxiandu&utm_medium=website 去超市怎么选葡萄酒?就要 Freestyle~    1 小时前   /xiandu/view/zhihu  知乎日报    http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
3:  http://daily.zhihu.com/story/9657035?utm_source=gank.io%2Fxiandu&utm_medium=website 公路自行车赛选手必须要佩戴头盔吗?   2 小时前   /xiandu/view/zhihu  知乎日报    http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
4:  http://www.ifanr.com/942151?utm_source=gank.io%2Fxiandu&utm_medium=website  除了性能超强的卡车和超跑,马斯克还发布了一款每个人都买得起的“特斯拉”     2 小时前   /xiandu/view/ifanr  爱范儿 http://ww3.sinaimg.cn/large/0066P23Wjw1f9rylijz6rj3030030gle.jpg
5:  https://cn.engadget.com/2017/11/17/walmart-tesla-semi-test/?utm_source=gank.io%2Fxiandu&utm_medium=website  沃尔玛决定试一试 Tesla Semi 电动半挂卡车的水温   2 小时前   /xiandu/view/engadget   Engadget 中文版    http://ww1.sinaimg.cn/large/0066P23Wjw1f9rym3y697j30300300sj.jpg
6:  http://www.ifanr.com/942154?utm_source=gank.io%2Fxiandu&utm_medium=website  从红杉到腾讯:IPO 收割大户转换背后,互联网创投界发生了什么?    2 小时前   /xiandu/view/ifanr  爱范儿 http://ww3.sinaimg.cn/large/0066P23Wjw1f9rylijz6rj3030030gle.jpg
7:  http://www.ifanr.com/942152?utm_source=gank.io%2Fxiandu&utm_medium=website  原因不明,苹果智能音箱 HomePod 延期上市    2 小时前   /xiandu/view/ifanr  爱范儿 http://ww3.sinaimg.cn/large/0066P23Wjw1f9rylijz6rj3030030gle.jpg
8:  http://www.ifanr.com/942144?utm_source=gank.io%2Fxiandu&utm_medium=website  360 是卖什么的?  3 小时前   /xiandu/view/ifanr  爱范儿 http://ww3.sinaimg.cn/large/0066P23Wjw1f9rylijz6rj3030030gle.jpg
9:  http://daily.zhihu.com/story/9656953?utm_source=gank.io%2Fxiandu&utm_medium=website 能否比较详细的介绍艺术家Maurizio Cattelan的艺术观念与作品?  3 小时前   /xiandu/view/zhihu  知乎日报    http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
10: http://www.toodaylab.com/74784?utm_source=gank.io%2Fxiandu&utm_medium=website   Hermès 为什么卖那么贵?掌握这 3 点,看懂奢侈品定价玄机    4 小时前   /xiandu/view/toodaylab  理想生活实验室 http://ww4.sinaimg.cn/large/610dc034gw1f9usojtqdfj21kw1kwn5e.jpg
11: http://daily.zhihu.com/story/9656556?utm_source=gank.io%2Fxiandu&utm_medium=website 为什么我们很少见到飞机爆胎?  5 小时前   /xiandu/view/zhihu  知乎日报    http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
12: https://cn.engadget.com/2017/11/17/apple-delays-homepod-speaker-launch-to-early-2018/?utm_source=gank.io%2Fxiandu&utm_medium=website    苹果延后出货 HomePod 智能喇叭至2018年初  5 小时前   /xiandu/view/engadget   Engadget 中文版    http://ww1.sinaimg.cn/large/0066P23Wjw1f9rym3y697j30300300sj.jpg
13: http://www.ifanr.com/941870?utm_source=gank.io%2Fxiandu&utm_medium=website  为什么情怀真的能当饭吃?    5 小时前   /xiandu/view/ifanr  爱范儿 http://ww3.sinaimg.cn/large/0066P23Wjw1f9rylijz6rj3030030gle.jpg
14: http://www.toodaylab.com/74783?utm_source=gank.io%2Fxiandu&utm_medium=website   今日消费资讯:《神奇动物在哪里 2》定名、赵丽颖成为浪琴全新优雅大使  5 小时前   /xiandu/view/toodaylab  理想生活实验室 http://ww4.sinaimg.cn/large/610dc034gw1f9usojtqdfj21kw1kwn5e.jpg
15: http://daily.zhihu.com/story/9656693?utm_source=gank.io%2Fxiandu&utm_medium=website 听不见的悲鸣:浅谈「熊孩子」  6 小时前   /xiandu/view/zhihu  知乎日报    http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
16: http://daily.zhihu.com/story/9657243?utm_source=gank.io%2Fxiandu&utm_medium=website 威尼斯人如何看待城市正在下沉的现实?  7 小时前   /xiandu/view/zhihu  知乎日报    http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
17: http://www.ifanr.com/942026?utm_source=gank.io%2Fxiandu&utm_medium=website  在作死这件事上,你可能输给了微博    7 小时前   /xiandu/view/ifanr  爱范儿 http://ww3.sinaimg.cn/large/0066P23Wjw1f9rylijz6rj3030030gle.jpg
18: http://www.qdaily.com/articles/47339.html?source=feed&utm_source=gank.io%2Fxiandu&utm_medium=website    Chanel 在日本的首家精品店重装开业,黑白色的   7 小时前   /xiandu/view/qdaily 好奇心日报   http://ww2.sinaimg.cn/large/610dc034gw1f9sg2pq9ufj202s02s0sj.jpg
19: http://www.qdaily.com/articles/47353.html?source=feed&utm_source=gank.io%2Fxiandu&utm_medium=website    牛津在中国推的阅读俱乐部,还是为了通过教英语卖书    7 小时前   /xiandu/view/qdaily 好奇心日报   http://ww2.sinaimg.cn/large/610dc034gw1f9sg2pq9ufj202s02s0sj.jpg
20: http://www.qdaily.com/articles/47342.html?source=feed&utm_source=gank.io%2Fxiandu&utm_medium=website    这些巧用天光的设计,可能会让你更愿意下厨房|这个设计了不起   7 小时前   /xiandu/view/qdaily 好奇心日报   http://ww2.sinaimg.cn/large/610dc034gw1f9sg2pq9ufj202s02s0sj.jpg

以上就是具体使用方法了,需要理解详细方法的去看官方API

全部代码

        final Connection connect = Jsoup.connect("http://gank.io/xiandu/");
        // 伪装成浏览器抓取
        connect.header("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:32.0) Gecko/20100101 Firefox/32.0");
        final Document document = connect.get();

        // 获取标题
        String title1 = document.head().select("title").text();
        // 或者
        String title2 = document.title();
        System.out.println(title1);
        System.out.println(title2);

        Elements typoElements = document.body().select("div.typo").select("div.container");
        // 多个select()拼接可以用空格隔开
        Elements liElements = typoElements.select("div#xiandu_cat ul li");
        for (Element element : liElements) {
            String href = element.select("a").attr("href");
            String text = element.text();
            System.out.println(href + "\t" + text);
        }

        Elements itemElements = typoElements.select("div.xiandu_items div.xiandu_item");
        for (Element element : itemElements) {
            Elements leftElements = element.select("div.xiandu_left");
            // 编号,1:
            String no = leftElements.select("span.xiandu_index").text();
            // 跳转网址,http://daily.zhihu.com/story/9657300?utm_source=gank.io%2Fxiandu&utm_medium=website
            String url = leftElements.select("a").attr("href");
            // 内容,想精想怪 90——吃鸡手游化那些事
            String desc = leftElements.select("a").text();
            // 时间,8 分钟前
            String date = leftElements.select("span small").text();

            Elements rightElements = element.select("div.xiandu_right");
            // 来源url,/xiandu/view/zhihu
            String sourceUrl = rightElements.select("a.site-name").attr("href");
            // 来源名称,知乎日报
            String sourceTitle = rightElements.select("a.site-name").attr("title");
            // 来源图标,http://ww4.sinaimg.cn/large/610dc034jw1f9sfzr2gmnj204v04va9y.jpg
            String sourceIcon = rightElements.select("a.site-name img").attr("src");
            System.out.println(no + "\t" + url + "\t" + desc + " \t" + date + "\t" + sourceUrl + "\t" + sourceTitle + "\t" + sourceIcon);
        }

在我的博客中查看更多简单实用文章