Jsoup

快速入门

  • 步骤:

    1. 导入 jar 包
    2. 获取 Document对象
    3. 获取对应的标签的 Element 对象
    4. 获取数据
  • student.xml

<?xml version="1.0" encoding="UTF-8" ?>

<students>
    <student number="heima_0001">
        <name>zhangsan</name>
        <age>20</age>
        <sex>male</sex>
    </student>

    <student number="heima_0002">
        <name>lisi</name>
        <age>22</age>
        <sex>female</sex>
    </student>
</students>
  • JsoupDemo1.java
package com.my.xml.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

/**
 * Jsoup快速入门
 */
public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        // 1.导入jar包
        // 2.获取Document对象,根据xml文档获取

        // 2.1 获取xml文档的路径
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        // 2.2 解析xml文档,加载文档进内存,获取 dom 树 --> Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 3. 获取元素Element

        Elements elements = document.getElementsByTag("name");
//        System.out.println(elements.size());
        // 3.1 获取第一个name的element对象
        Element element = elements.get(0);
        // 3.2 获取数据
        String name = element.text(); // 获取文本数据
        System.out.println(name); // zhangsan
    }
}

Jsoup对象

  • Jsoup:工具类,可以解析 html 或 xml 文档,返回 Document对象
    • parse:解析 html 或 xml 文档,返回 Document
      • parse(File in, String charsetName):解析 xml 或 html 文件的
      • parse(String html):解析 xml 或 html 字符串
      • parse(URL url, int timeoutMillis):通过网络路径获取指定的 html 或 xml 的文档对象
  • 示例:
package com.my.xml.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;
import java.net.URL;

/**
 * Jsoup对象
 */
public class JsoupDemo2 {
    public static void main(String[] args) throws IOException {
        // 1.parse(File in, String charsetName):解析 xml 或 html文件
/*
        String path = JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath();
        Document document = Jsoup.parse(new File(path), "utf-8");
        System.out.println(document);
*/

        // 2.parse(String html)
/*
        String str = "<?xml version="1.0" encoding="UTF-8" ?>
" +
                "
" +
                "<students>
" +
                "    <student number="heima_0001">
" +
                "        <name>zhangsan</name>
" +
                "        <age>20</age>
" +
                "        <sex>male</sex>
" +
                "    </student>
" +
                "
" +
                "    <student number="heima_0002">
" +
                "        <name>lisi</name>
" +
                "        <age>22</age>
" +
                "        <sex>female</sex>
" +
                "    </student>
" +
                "</students>
";
        Document document = Jsoup.parse(str);
        System.out.println(document);
*/
        // 3.parse(URL url, int timeoutMillis):通过网络路径获取指定的 html
        URL url = new URL("https://baike.baidu.com/item/jsoup");
        Document document = Jsoup.parse(url, 10000);
        System.out.println(document);

    }
}

Document对象

  • Document:文档对象。代表内存中的 dom 树
    • 获取Element对象
      • getElementsByTag(String tagName):根据标签名获取元素对象集合
      • getElementsByAttribute(String key):根据属性名称获取元素对象集合
      • getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
      • getElementById(String id):根据 id 属性值获取唯一的 element 对象
  • 示例:
package com.my.xml.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

/**
 * Doucument(Element)对象
 */
public class JsoupDemo3 {
    public static void main(String[] args) throws IOException {
        // 获取student.xml的路径
        String path = JsoupDemo2.class.getClassLoader().getResource("student.xml").getPath();
        // 获取document对象
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 1.获取所有 student 对象们
        Elements elements = document.getElementsByTag("student");
        System.out.println(elements);
        System.out.println("===============");

        // 2.获取属性名为 id 的元素对象们
        Elements elements1 = document.getElementsByAttribute("id");
        System.out.println(elements1);
        System.out.println("===============");

        // 3.获取属性名为number,属性值为heima_0001的元素
        Elements elements2 = document.getElementsByAttributeValue("number", "heima_0001");
        System.out.println(elements2);
        System.out.println("===============");

        // 4.获取id为name的对象
        Element element = document.getElementById("name");
        System.out.println(element);
    }
}

Elements对象

  • Elements:元素 Element 对象的集合。可以当作 ArrayList<Element> 来使用

Element对象

  • Element:元素对象
    1. 获取子元素对象

      • getElementsByTag(String tagName):根据标签名获取元素对象集合
      • getElementsByAttribute(String key):根据属性名称获取元素对象集合
      • getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
      • getElementById(String id):根据 id 属性值获取唯一的 element 对象
    2. 获取属性值

      • String attr(String attributeKey):根据属性名称获取属性值
    3. 获取文本内容

      • String text():获取所有子标签的纯文本内容
      • String html():获取标签体的所有内容(包括子标签标签和文本内容)

Node对象

  • Node:节点对象
    • 是 Document 和 Element 的父类

快捷查询方式

  1. selector:选择器

    • 使用的方法:Elements select(String cssQuery)
      • 语法:参考 Selector 类中定义的语法
  2. XPath:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。

    • 使用 Jsoup 的Xpath 需要额外导入 jar 包
    • 查询 W3cshool 参考手册,使用XPath的语法完成查询
    • 示例:
package com.my.xml.jsoup;

import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;
import java.io.IOException;

/**
 * XPath查询
 */
public class JsoupDemo6 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        // 1.获取student.xml的path
        String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
        // 2.获取Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");
        // 3.根据 Document对象,获取 JXDocument对象
        JXDocument jxDocument = new JXDocument(document);

        // 4.结合Xpath语法查询
        // 4.1 查询所有的student标签
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }

        System.out.println("--------------");

        // 4.2 查询所有student标签下的 name 标签
        List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode);
        }
        System.out.println("--------------");

        // 4.3 查询所有student标签下带有id属性值的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
        System.out.println("--------------");

        // 4.4 查询所有student标签下带有id属性值的name标签,并且id属性值为 itcast
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='itcast']");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
}
原文地址:https://www.cnblogs.com/rainszj/p/12188868.html