用jsoup捉取某报广告版,体会美美的jsoup选择器

Posted on 2017-03-07 by 毛三胖

摘要

jsoup 是一款用Java语言实现的HTML工具,它提供了一套非常方便的API用于HTML数据的操作和抽取。本文以一个示例程序为例,简要介绍了jsoup的最基本的用法,从示例中,你不难看出jsoup选择器的优美之处,你不妨也来动手试试吧!


1 jsoup简要介绍

jsoup 是一款用Java语言实现的的HTML工具,它提供了一套非常方便的API用于HTML的数据的操作和抽取,其最优美和强大的地方就是DOM选择器部分。相较于HtmlUnit,在选择器使用上jsoup真的是要好上太多。要想学习和使用jsoup,强烈建议您阅读官方文档。

jsoup网站:jsoup.org

2 jsoup示例程序

本程序的主要功能是利用jsoup连接某报纸电子版某天的头版页面,解析其版面目录并取得广告版的地址,连接并解析广告版页面,并将其广告图片以日期和版号命名保存到E盘的paper目录下。本程序除用到了jsoup的JAR包以外,还用到了apahce的Lang和IO两个JAR工具包,分别用来修剪字符串(trim)和拷贝图片到本地(copyURLToFile)。你可以利用maven引入JAR包,也可以自行下载JAR到类目录下。

jsoup下载地址:jsoup-1.10.2.jar

commons下载地址:Apache Commons

maven依赖:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.2</version>
</dependency>
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.4</version>
</dependency>
<dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.5</version>
</dependency>

示例程序:

package com.du42.jsoup;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.net.URL;

/**
 * Created by Fat3 www.42du.cn on 2017/3/7.
 */
public class PaperAdTools {

    /**
     * 下载一天的广告版面
     */
    public static void getOneDay() {
        String url = "http://paper.people.com.cn/rmrb/html/2017-03/07/nbs.D110000renmrb_01.htm";
        Document doc = null;
        try {
            doc = Jsoup.connect(url).get();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        Elements anchors = doc.select("div[class=right_title-name] a");
        for(Element anchor : anchors) {
            String title = StringUtils.trim(anchor.text());
            if(title.endsWith("广告")) {
                String version = title.substring(title.indexOf("第")+1,title.indexOf("版"));
                getADPage(version,"http://paper.people.com.cn/rmrb/html/2017-03/07/nbs.D110000renmrb_"+version+".htm");
            }
        }
    }

    /**
     * 下载一版广告的图片,并以日期和版号做为文件名称
     */
    private static void getADPage(String version, String ad_url){
        Document doc = null;
        try {
            doc = Jsoup.connect(ad_url).get();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Elements imgs = doc.select("div[class=left_c] div[class=ban] img");
        for(Element img : imgs) {
            String src = img.attr("src");
            String img_url = "http://paper.people.com.cn/rmrb" + src.substring(src.indexOf("/page"));
            try {
                FileUtils.copyURLToFile(new URL(img_url),new File("e:\\paper\\2017-03-07_"+version+".jpg"));
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        getOneDay();
    }
}

3 简要补充

程序的关键部分在于对Dom文档部分的选择,即doc.select("div[class=right_title-name] a"),通过变换不同的表达式从而取得Dom的不同部分。

为表达方便,示例程序中把日期写死在程序里面,如果想取得所有日期的数据,遍历日期即可达到目的,即DateFormat df1 = new SimpleDateFormat("yyyy-MM/dd")。

本示例程序只是为学习和交流,不能用于其它目的,下载的广告图片版权归属原单位。