Jsoup

Posted roadlandscape

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jsoup相关的知识,希望对你有一定的参考价值。

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

  jsoup的主要功能如下:

    从一个URL,文件或字符串中解析HTML

    使用DOM或CSS选择器来查找、取出数据

    可操作HTML元素、属性、文本

引入Jsoup依赖:

<!-- Jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.3</version>
</dependency>
<!-- 工具 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

Jsoup解析url

@Test
public void testJsoupUrl() throws Exception {
    // 解析url地址
    Document document = Jsoup.parse(new URL("https://www.cnblogs.com/roadlandscape/"), 1000);
    // 获取title内容
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title);
}

  PS:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用

Jsoup解析字符串

@Test
public void testJsoupString() throws Exception {
    // 解析字符串
    String content = FileUtils.readFileToString(new File("D:\\test.html"), "utf-8");
    Document document = Jsoup.parse(content, "utf-8");
    // 获取title内容
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title);
}

Jsoup直接解析文件,并封装为Document对象

@Test
public void testJsoupFile() throws Exception {
    // 解析文件
    Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8");
    // 获取title内容
    String title = document.getElementsByTag("title").first().text();
    System.out.println(title);
}

使用dom方式遍历文档

  元素获取:

    1.根据id查询元素getElementById

    2.根据标签获取元素getElementsByTag

    3.根据class获取元素getElementsByClass

    4.根据属性获取元素getElementsByAttribute

@Test
    public void testDOM() throws Exception {
        Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8");

        Element element = document.getElementById("city_bj");
        System.out.println(element.text());

        Element element2 = document.getElementsByTag("span").first();
        System.out.println(element2.text());

        Element element3 = document.getElementsByClass("class_a").first();
        System.out.println(element3.text());

        // Element element4 = document.getElementsByAttribute("abc").first();
        Element element4 = document.getElementsByAttributeValue("abc", "123").first();
        System.out.println(element4.text());
    }

  元素中获取数据:

    1.从元素中获取id

    2.从元素中获取className

    3.从元素中获取属性的值attr

    4.从元素中获取所有属性attributes

    5.从元素中获取文本内容text

@Test
public void testData() throws Exception {
    Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8");
    Element element = document.getElementById("test");

    String id = element.id();
    System.out.println(id);

    String className = element.className();
    System.out.println(className); // "class_a class_b"

    Set<String> set = element.classNames();
    for (String s : set) {
        System.out.println(s);
    } // class_a
      // class_b

    String attr = element.attr("id");
    System.out.println(attr);

    Attributes attributes = element.attributes();
    System.out.println(attributes.toString()); // id="test" class="class_a class_b"

    String text = element.text();
    System.out.println(text);
}

使用选择器语法查找元素:

@Test
public void testSelector() throws Exception {
    Document document = Jsoup.parse(new File("D:\\test.html"), "utf-8");

    Elements elements = document.select("span");
    for (Element element : elements) {
        System.out.println(element.text());
    }

    Element element = document.select("#test").first();
    System.out.println(element.text());

    Element element1 = document.select(".class_a").first();
    System.out.println(element1.text());

    Element element2 = document.select("[abc]").first();
    System.out.println(element2.text());

    Elements elements2 = document.select("[class=s_name]");
    for (Element e : elements2) {
        System.out.println(e.text());
    }
}

Selector选择器组合使用:

  el#id: 元素+ID,比如: h3#city_bj

  el.class: 元素+class,比如: li.class_a

  el[attr]: 元素+属性名,比如: span[abc]

  任意组合: 比如:span[abc].s_name

  ancestor child: 查找某个元素下子元素,比如:.city_con li 查找"city_con"下的所有li

  parent > child: 查找某个父元素下的直接子元素,比如: .city_con > ul > li 查找city_con第一级(直接子元素)的ul,再找所有ul下的第一级li

  parent > *: 查找某个父元素下所有直接子元素

以上是关于Jsoup的主要内容,如果未能解决你的问题,请参考以下文章

jsoup - 去除所有格式和链接标签,只保留文本

Jsoup 没有完全获取原始 html 代码

初识Java爬虫之Jsoup,提供参考代码

抓jsoup_01_方案代码

Jsoup代码示例解析网页+提取文本

Java jsoup连接问题