Jsoup

  • Jsoup官方地址:https://jsoup.org/ 
  • 中文文档:https://www.open-open.com/jsoup/
  • Jsoup最新下载:https://jsoup.org/download
  • Jsoup文档:https://jsoup.org/cookbook/introduction/parsing-a-document
  • Maven Repository: https://mvnrepository.com/

  • 博客园:http://www.cnblogs.com/
  • 在线运行:https://c.runoob.com/compile/10
  • 其他爬虫:https://www.oschina.net/project/tag/64/spider?lang=19&os=0&sort=view&p=1

Jsoup简介

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据

我们在爬虫采集网页领域,主要作用是 用HttpClient获取到网页后,具体的网页提取需要的信息的时候 ,就用到Jsoup,Jsoup可以使用强大的类似Jquery,css选择器,来获取需要的数据

jsoup 的主要功能如下:

  1. 从一个URL,文件或字符串中解析 HTML
  2. 使用DOM或CSS选择器来查找、取出数据
  3. 可操作HTML元素、属性、文木

 Maven 配置:



    org.jsoup
    jsoup
    1.11.3

 


 

入门案例

我们用Jsoup来提取下http://www.cnblogs.com/ 博客园的 网页title(标题)  和 (口号);

 Jsoup_第1张图片

 

这里我们要用到HttpClient来获取网页内容:

gradle 配置:

//添加 httpclient 支持
// https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.7'

//添加 jsoup 支持
// https://mvnrepository.com/artifact/org.jsoup/jsoup
compile group: 'org.jsoup', name: 'jsoup', version: '1.11.3'

 maven 项目:



    org.apache.httpcomponents
    httpclient
    4.5.7

 


    org.jsoup
    jsoup
    1.11.3
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;
import java.io.IOException;

 获取一个网页

/**
 * 输入一个网址返回这个网址的字符串
 */
public String getHtml(String str) throws IOException {
    CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建httpclient实例
    HttpGet httpget = new HttpGet(str); // 创建httpget实例
    CloseableHttpResponse response = httpclient.execute(httpget); // 执行get请求
    HttpEntity entity = response.getEntity(); // 获取返回实体
    String content = EntityUtils.toString(entity, "utf-8");
    response.close(); // 关闭流和释放系统资源
    return content;
}
/**
 * 爬取 博客园
 * 1、网页标题
 * 2、口号
 */
@Test
public void test() throws IOException {
    Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象
    Elements elements = doc.getElementsByTag("title"); // 获取tag是title的所有DOM元素
    Element element = elements.get(0); // 获取第1个元素
    String title = element.text(); // 返回元素的文本
    System.out.println("网页标题:" + title);

    Element element2 = doc.getElementById("site_nav_top"); // 获取id=site_nav_top的DOM元素
    String navTop = element2.text(); // 返回元素的文本
    System.out.println("口号:" + navTop);
}

输出:

网页标题:博客园 - 代码改变世界
口号:代码改变世界

/**
 * 获取文章的 url
 */
@Test
public void test5() throws IOException {
    Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

    Elements linkElements = doc.select("#post_list .post_item .post_item_body h3 a"); //通过选择器查找所有博客链接DOM
    for (Element e : linkElements) {
        System.out.println(e.attr("href"));
    }

}

 

Jsoup查找DOM元素

Jsoup提供了丰富的API来给我们查找我们需要的DOM元素,常用的如下:

getElementById(Stringid) 根据 id 来查询 DOM 

getElementsByTag(StringtagName) 根据 tag 名称来查询 DOM 

getElementsByClass(StringclassName) 根据样式名称来查询 DOM 

getElementsByAttribute(Stringkey) 根据属性名来查询 DOM 

getElementsByAttributeValue(Stringkey,Stringvalue) 根据属性名和属性值来查询 DOM
/**
 * Jsoup 查找 DOM 元素
 */
@Test
public void test2() throws IOException {
    Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

    Elements itemElements = doc.getElementsByClass("post_item"); // 根据样式名称来查询DOM
    System.out.println("=======输出post_item==============");
    for (Element e : itemElements) {
        System.out.println(e.html());//获取里面所有的 html 包括文本
        System.out.println("\n");
    }

    Elements widthElements = doc.getElementsByAttribute("width"); // 根据属性名称来查询DOM(id class type 等),用的少一般很难找用这种方法
    System.out.println("=======输出with的DOM==============");
    for (Element e : widthElements) {
        System.out.println(e.toString());//不能用 e.html() 这里需要输出 DOM
    }

    //
    Elements targetElements = doc.getElementsByAttributeValue("target", "_blank");
    System.out.println("=======输出target-_blank的DOM==============");
    for (Element e : targetElements) {
        System.out.println(e.toString());
    }
}

 

Jsoup使用选择器语法查找DOM元素

我们前面通过标签名,Id,Class样式等来搜索DOM,这些是不能满足实际开发需求的,很多时候我们需要寻找有规律的DOM集合,很多个有规律的标签层次,这时候,选择器就用上了。css jquery 都有,Jsoup支持css,jquery类似的选择器语法。

/**
 * 有层级关系
 */
@Test
public void test3() throws IOException {
    Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

    Elements linkElements = doc.select("#post_list .post_item .post_item_body h3 a"); //通过选择器查找所有博客链接DOM(范围重小到大)
    for (Element e : linkElements) {
        System.out.println("博客标题:" + e.text());//超链接的内容
    }

    System.out.println("--------------------带有href属性的a元素--------------------------------");
    Elements hrefElements = doc.select("a[href]"); // 带有href属性的a元素
    for (Element e : hrefElements) {
        System.out.println(e.toString());
    }

    System.out.println("------------------------查找扩展名为.png的图片----------------------------");
    Elements imgElements = doc.select("img[src$=.png]"); // 查找扩展名为.png的图片DOM节点
    for (Element e : imgElements) {
        System.out.println(e.toString());
    }

    System.out.println("------------------------获取第一个元素----------------------------");
    Element element = doc.getElementsByTag("title").first(); // 获取tag是title的所有DOM元素
    String title = element.text(); // 返回元素的文本
    System.out.println("网页标题是:" + title);
}

 Jsoup_第2张图片


 

Jsoup获取DOM元素属性值

Jsoup_第3张图片

 Jsoup_第4张图片

/**
 * 获取 DOM 元素属性值
 */
@Test
public void test4() throws IOException {
    Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

    Elements linkElements = doc.select("#post_list .post_item .post_item_body h3 a"); //通过选择器查找所有博客链接DOM
    for (Element e : linkElements) {
        System.out.println("博客标题:" + e.text());//获取里面所有的文本
        System.out.println("博客地址:" + e.attr("href"));
        System.out.println("target:" + e.attr("target"));
    }

    System.out.println("------------------------友情链接----------------------------");
    Element linkElement = doc.select("#friend_link").first();
    System.out.println("纯文本:" + linkElement.text());//去掉 html
    System.out.println("------------------------Html----------------------------");
    System.out.println("Html:" + linkElement.html());
}
/**
 * 获取文章的 url
 */
@Test
public void test5() throws IOException {
    Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

    Elements linkElements = doc.select("#post_list .post_item .post_item_body h3 a"); //通过选择器查找所有博客链接DOM
    for (Element e : linkElements) {
        System.out.println(e.attr("href"));
    }

}

 

 注意:Element 的几个获取内容的方法区别

  1. text()            获取的是去掉了 html 元素,也就是只用元素内容
  2. toString()      DOM
  3. html()          获取里面所有的 html 包括文本

 

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;

import java.io.IOException;

public class Main {

    /**
     * 输入一个网址返回这个网址的字符串
     */
    public String getHtml(String str) throws IOException {
        CloseableHttpClient httpclient = HttpClients.createDefault(); // 创建httpclient实例
        HttpGet httpget = new HttpGet(str); // 创建httpget实例
        CloseableHttpResponse response = httpclient.execute(httpget); // 执行get请求
        HttpEntity entity = response.getEntity(); // 获取返回实体
        String content = EntityUtils.toString(entity, "utf-8");
        response.close(); // 关闭流和释放系统资源
        return content;
    }

    /**
     * 爬取 博客园
     * 1、网页标题
     * 2、口号
     */
    @Test
    public void test() throws IOException {
        Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象
        Elements elements = doc.getElementsByTag("title"); // 获取tag是title的所有DOM元素
        Element element = elements.get(0); // 获取第1个元素
        String title = element.text(); // 返回元素的文本
        System.out.println("网页标题:" + title);

        Element element2 = doc.getElementById("site_nav_top"); // 获取id=site_nav_top的DOM元素
        String navTop = element2.text(); // 返回元素的文本
        System.out.println("口号:" + navTop);
    }

    /**
     * Jsoup 查找 DOM 元素
     */
    @Test
    public void test2() throws IOException {
        Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

        Elements itemElements = doc.getElementsByClass("post_item"); // 根据样式名称来查询DOM
        System.out.println("=======输出post_item==============");
        for (Element e : itemElements) {
            System.out.println(e.html());//获取里面所有的 html 包括文本
            System.out.println("\n");
        }

        Elements widthElements = doc.getElementsByAttribute("width"); // 根据属性名称来查询DOM(id class type 等),用的少一般很难找用这种方法
        System.out.println("=======输出with的DOM==============");
        for (Element e : widthElements) {
            System.out.println(e.toString());//不能用 e.html() 这里需要输出 DOM
        }

        //
        Elements targetElements = doc.getElementsByAttributeValue("target", "_blank");
        System.out.println("=======输出target-_blank的DOM==============");
        for (Element e : targetElements) {
            System.out.println(e.toString());
        }
    }

    /**
     * 有层级关系
     */
    @Test
    public void test3() throws IOException {
        Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

        Elements linkElements = doc.select("#post_list .post_item .post_item_body h3 a"); //通过选择器查找所有博客链接DOM(范围重小到大)
        for (Element e : linkElements) {
            System.out.println("博客标题:" + e.text());//超链接的内容
        }

        System.out.println("--------------------带有href属性的a元素--------------------------------");
        Elements hrefElements = doc.select("a[href]"); // 带有href属性的a元素
        for (Element e : hrefElements) {
            System.out.println(e.toString());
        }

        System.out.println("------------------------查找扩展名为.png的图片----------------------------");
        Elements imgElements = doc.select("img[src$=.png]"); // 查找扩展名为.png的图片DOM节点
        for (Element e : imgElements) {
            System.out.println(e.toString());
        }

        System.out.println("------------------------获取第一个元素----------------------------");
        Element element = doc.getElementsByTag("title").first(); // 获取tag是title的所有DOM元素
        String title = element.text(); // 返回元素的文本
        System.out.println("网页标题是:" + title);
    }

    /**
     * 获取 DOM 元素属性值
     */
    @Test
    public void test4() throws IOException {
        Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

        Elements linkElements = doc.select("#post_list .post_item .post_item_body h3 a"); //通过选择器查找所有博客链接DOM
        for (Element e : linkElements) {
            System.out.println("博客标题:" + e.text());//获取里面所有的文本
            System.out.println("博客地址:" + e.attr("href"));
            System.out.println("target:" + e.attr("target"));
        }

        System.out.println("------------------------友情链接----------------------------");
        Element linkElement = doc.select("#friend_link").first();
        System.out.println("纯文本:" + linkElement.text());//去掉 html
        System.out.println("------------------------Html----------------------------");
        System.out.println("Html:" + linkElement.html());
    }


    /**
     * 获取文章的 url
     */
    @Test
    public void test5() throws IOException {
        Document doc = Jsoup.parse(getHtml("http://www.cnblogs.com/")); // 解析网页 得到文档对象

        Elements linkElements = doc.select("#post_list .post_item .post_item_body h3 a"); //通过选择器查找所有博客链接DOM
        for (Element e : linkElements) {
            System.out.println(e.attr("href"));
        }

    }
}

  • https://blog.csdn.net/osaymissyou0/article/details/49386637

你可能感兴趣的:(网络爬虫,Java)