Administrator
发布于 2025-03-27 / 5 阅读
0

详解 Jsoup 通过 CSS 选择器提取 HTML 元素

#AI

在使用 Jsoup 通过 CSS 选择器提取 HTML 元素时,CSS 选择器为我们提供了丰富的方式来精准定位所需元素。以下为你详细介绍不同场景下使用 CSS 选择器提取元素的示例。

1. 基本选择器

1.1 元素选择器

通过元素的标签名来选择元素。

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

public class ElementSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><h1>标题</h1><p>段落内容</p></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("p");
        for (Element p : paragraphs) {
            System.out.println(p.text());
        }
    }
}

上述代码中,doc.select("p") 会选取 HTML 文档里所有的 <p> 元素。

1.2 ID 选择器

通过元素的 id 属性来选择元素。

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

public class IdSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><div id=\"myDiv\">这是一个 div 元素。</div></body></html>";
        Document doc = Jsoup.parse(html);
        Element div = doc.select("#myDiv").first();
        if (div != null) {
            System.out.println(div.text());
        }
    }
}

这里 doc.select("#myDiv") 借助 idmyDiv 来选取对应的 <div> 元素,first() 方法则是获取匹配到的第一个元素。

1.3 类选择器

通过元素的 class 属性来选择元素。

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

public class ClassSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><p class=\"myClass\">段落1</p><p class=\"myClass\">段落2</p></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select(".myClass");
        for (Element p : paragraphs) {
            System.out.println(p.text());
        }
    }
}

doc.select(".myClass") 能够选取所有 classmyClass 的元素。

2. 组合选择器

2.1 后代选择器

选取某个元素的所有后代元素。

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

public class DescendantSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><div><p>段落内容</p></div></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("div p");
        for (Element p : paragraphs) {
            System.out.println(p.text());
        }
    }
}

doc.select("div p") 会选取所有 <div> 元素内的 <p> 元素。

2.2 子选择器

选取某个元素的直接子元素。

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

public class ChildSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><ul><li>列表项1</li><li>列表项2</li></ul></body></html>";
        Document doc = Jsoup.parse(html);
        Elements listItems = doc.select("ul > li");
        for (Element li : listItems) {
            System.out.println(li.text());
        }
    }
}

doc.select("ul > li") 仅选取 <ul> 元素的直接子元素 <li>

2.3 相邻兄弟选择器

选取紧接在另一个元素之后的元素。

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

public class AdjacentSiblingSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><h2>标题</h2><p>段落内容</p></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("h2 + p");
        for (Element p : paragraphs) {
            System.out.println(p.text());
        }
    }
}

doc.select("h2 + p") 会选取紧接在 <h2> 元素之后的 <p> 元素。

2.4 通用兄弟选择器

选取在另一个元素之后的所有兄弟元素。

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

public class GeneralSiblingSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><h2>标题</h2><p>段落1</p><p>段落2</p></body></html>";
        Document doc = Jsoup.parse(html);
        Elements paragraphs = doc.select("h2 ~ p");
        for (Element p : paragraphs) {
            System.out.println(p.text());
        }
    }
}

doc.select("h2 ~ p") 会选取 <h2> 元素之后的所有 <p> 兄弟元素。

3. 属性选择器

3.1 存在属性选择器

选取具有指定属性的元素。

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

public class AttributeExistsSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><a href=\"https://example.com\">链接</a></body></html>";
        Document doc = Jsoup.parse(html);
        Elements links = doc.select("a[href]");
        for (Element a : links) {
            System.out.println(a.text());
        }
    }
}

doc.select("a[href]") 会选取所有具有 href 属性的 <a> 元素。

3.2 属性值选择器

选取具有指定属性且属性值匹配的元素。

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

public class AttributeValueSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><a href=\"https://example.com\">链接</a></body></html>";
        Document doc = Jsoup.parse(html);
        Elements links = doc.select("a[href=https://example.com]");
        for (Element a : links) {
            System.out.println(a.text());
        }
    }
}

doc.select("a[href=https://example.com]") 会选取 href 属性值为 https://example.com<a> 元素。

4. 伪类选择器

4.1 第一个子元素选择器

选取父元素的第一个子元素。

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

public class FirstChildSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><ul><li>列表项1</li><li>列表项2</li></ul></body></html>";
        Document doc = Jsoup.parse(html);
        Elements firstListItem = doc.select("ul li:first-child");
        for (Element li : firstListItem) {
            System.out.println(li.text());
        }
    }
}

doc.select("ul li:first-child") 会选取 <ul> 元素的第一个 <li> 子元素。

4.2 最后一个子元素选择器

选取父元素的最后一个子元素。

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

public class LastChildSelectorExample {
    public static void main(String[] args) {
        String html = "<html><body><ul><li>列表项1</li><li>列表项2</li></ul></body></html>";
        Document doc = Jsoup.parse(html);
        Elements lastListItem = doc.select("ul li:last-child");
        for (Element li : lastListItem) {
            System.out.println(li.text());
        }
    }
}

doc.select("ul li:last-child") 会选取 <ul> 元素的最后一个 <li> 子元素。

这些示例覆盖了常见的 CSS 选择器场景,你可以依据具体需求灵活运用不同的选择器来提取 HTML 元素。