Jsoup

前言

  • Jsoup 是 xml/html 解析工具。

  • Jsoup 除了可以解析 html/xml 外,还可以进行修改行为。

  • xml 是 Extensible Markup Language 可扩展标记语言的缩写。

  • html 是 HyperText Markup Language 超文本标记语言的缩写。

  • html 可以简单看成是 xml 的一个子集。

    • html 用的都是一些预先定义的元素,如 <html>, <a>, <body>, <table>
    • 而 xml 什么元素都可以自定义:如 <a>, <b>, <aabb>
  • Jsoup 官网

  • Jsoup 快速入门

1、Jsoup

  • Java 本身自带对 xml 的解析。在 javax.xml 这个包下,这种方式叫做 sax/dom,非常难用。

  • 因为 Java 自带的很难用,所以就出现了更方便的第三方工具 dom4j, 解析效率大大提高了。

  • 现在又出现了更方便的 Jsoup

  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;

    public class Test {
    public static void main(String[] args) throws Exception {

    String html = "<html><body><p>Hello HTML</p></body></html>";
    Document doc = Jsoup.parse(html);

    Elements as = doc.getElementsByTag("p");
    for (Element e : as) {
    System.out.println(e.text());
    }
    }
    }

2、获取文档

  • 获取 Document 对象对象的方式有多种,常见的就是基于字符串,文件,网页地址。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    String html1 = "<html><body><p>Hello HTML</p></body></html>";
    Document doc1 = Jsoup.parse(html1);
    System.out.println("基于字符串方式得到的 Document:\r\n" + doc1);

    File f = new File("a.html");
    if(f.exists()) {
    Document doc2 = Jsoup.parse(f,"utf-8");
    System.out.println("基于文件方式得到的 Document:\r\n" + doc2);
    }

    String url = "http://www.baidu.com";
    Document doc3 = Jsoup.parse(new URL(url),5000); // 超过 5 秒就报错
    System.out.println("基于 URL 方式得到的 Document:\r\n" + doc3);

3、获取元素

  • 获取元素比较常见的几种方式:通过 id, 标签或者类名称获取。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    File f = new File("b.html");
    if (!f.exists()) {
    return;
    }

    Document doc = Jsoup.parse(f,"utf-8");

    // 通过 id 获取
    Element e = doc.getElementById("productName");

    // 通过标签获取
    Elements es = doc.getElementsByTag("a");

    // 通过类名称获取
    Elements es = doc.getElementsByClass("RightBox");

    // 通过属性获取
    Elements es = doc.getElementsByAttribute("name");

4、获取内容和文本

  • 获取内容和文本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    File f = new File("c.html");
    if (!f.exists()) {
    return;
    }

    Document doc = Jsoup.parse(f,"utf-8");

    Element e = doc.getElementById("d1");

    // 获取属性
    e.attr("id")

    // 获取所有属性
    e.attributes()

    // 获取id
    e.id()

    // 获取类名称
    e.className()

    // 获取所有类名称
    e.classNames()

    // 获取文本
    e.text()

    // 获取 html
    e.html()

    // 获取外 html
    e.outerHtml()

    // 获取标签信息
    e.tagName()

5、选择器语法

  • 在选择元素的时候,除了使用方法名如 getElementById 这样的外,还可以用选择器语法来选择。

  • 操作起来就像 jQuery了,比如 getElementById 就可以写成是 select("#id")

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    File f = new File("b.html");
    if (!f.exists()) {
    return;
    }

    doc = Jsoup.parse(f,"utf-8");

    // 像 jquery 那样的选择器语法

    // 选择所有的超链
    Elements es = doc.select("a");

    // 根据 id 进行选择
    Elements es = doc.select("#logocover");

    // 根据 class 进行选择
    Elements es = doc.select(".clearfloat");

    // 根据属性进行选择
    Elements es = doc.select("[href]");

    // 有属性以 tar 开头
    Elements es = doc.select("[^tar]");

    // 根据属性值选择
    Elements es = doc.select("[type='application/javascript']");

    // 属性值以什么开头
    Elements es = doc.select("[href^='http://www.oracle.com']");

    // 属性值以什么结尾
    Elements es = doc.select("[href$='index.html']");

    // 属性值包含什么
    Elements es = doc.select("[href*='download']");

6、操作属性和内容

  • Jsoup 除了可以解析 html/xml 外,还可以进行修改行为。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    File f = new File("a.html");
    if (!f.exists()) {
    return;
    }

    doc = Jsoup.parse(f,"utf-8");

    Element e = doc.select("p").first();
    e.attr("class", "class1");

    e.appendText(" Hello JSoup");
文章目录
  1. 1. 前言
  2. 2. 1、Jsoup
  3. 3. 2、获取文档
  4. 4. 3、获取元素
  5. 5. 4、获取内容和文本
  6. 6. 5、选择器语法
  7. 7. 6、操作属性和内容
隐藏目录