在使用 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")
借助 id
为 myDiv
来选取对应的 <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")
能够选取所有 class
为 myClass
的元素。
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 元素。