Jsoup 示例指南
Jsoup是一个非常流行的 Java 库,用于解析 HTML 文档、处理网页内容和进行网页抓取。它提供了强大的 HTML 解析能力,并支持类似 jQuery 的 DOM 操作接口,适用于网页内容提取、修改以及 HTML 元素操作等任务。以下是详细的 Jsoup 示例指南,涵盖了常见的使用场景和功能。帮助你更好地理解如何使用该库。
1. 基本的 HTML 解析
示例:解析 HTML 字符串
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupParseExample {
public static void main(String[] args) {
String html = "<html><head><title>Sample Page</title></head>"
+ "<body><p>Hello, World!</p></body></html>";
// 解析 HTML 字符串
Document doc = Jsoup.parse(html);
// 获取标题
System.out.println("Title: " + doc.title()); // 输出: Sample Page
// 获取 <p> 标签中的文本
System.out.println("Paragraph: " + doc.select("p").text()); // 输出: Hello, World!
}
}
2. 从 URL 解析 HTML
示例:从网站加载 HTML
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
public class JsoupFromURLExample {
public static void main(String[] args) {
try {
// 连接到 URL 并抓取 HTML 内容
Document doc = Jsoup.connect("https://example.com").get();
// 打印页面标题
System.out.println("Title: " + doc.title());
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 选择元素和获取文本
示例:选择特定元素并获取其文本
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupSelectElements {
public static void main(String[] args) {
String html = "<html><body><p class='intro'>Hello</p><p>World</p></body></html>";
// 解析 HTML
Document doc = Jsoup.parse(html);
// 选择并打印具有 class 'intro' 的 <p> 标签文本
System.out.println("Intro Paragraph: " + doc.select(".intro").text()); // 输出: Hello
// 选择所有 <p> 标签并打印
doc.select("p").forEach(p -> {
System.out.println("Paragraph: " + p.text());
});
// 输出:
// Intro Paragraph: Hello
// Paragraph: World
}
}
4. 获取和修改属性值
示例:获取和修改 HTML 元素的属性
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class JsoupAttributesExample {
public static void main(String[] args) {
String html = "<html><body><a href='https://example.com' class='link'>Click Here</a></body></html>";
Document doc = Jsoup.parse(html);
// 获取 <a> 标签的 href 属性
Element link = doc.select("a").first();
System.out.println("Link Href: " + link.attr("href")); // 输出: https://example.com
// 修改 <a> 标签的 href 属性
link.attr("href", "https://new-example.com");
System.out.println("Updated Link Href: " + link.attr("href")); // 输出: https://new-example.com
}
}
5. 修改 HTML 元素内容
示例:修改 HTML 标签的内容
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class JsoupModifyContent {
public static void main(String[] args) {
String html = "<html><body><p id='message'>Original message</p></body></html>";
Document doc = Jsoup.parse(html);
// 获取并修改 <p> 标签的文本
Element p = doc.getElementById("message");
p.text("Updated message");
// 输出修改后的 HTML
System.out.println(doc.html()); // 输出: <html><body><p id="message">Updated message</p></body></html>
}
}
6. 删除元素
示例:删除页面中的元素
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupRemoveElement {
public static void main(String[] args) {
String html = "<html><body><p>This is a paragraph.</p><p class='remove'>Remove this one</p></body></html>";
Document doc = Jsoup.parse(html);
// 删除具有 'remove' 类名的 <p> 标签
doc.select(".remove").remove();
// 输出修改后的 HTML
System.out.println(doc.html()); // 输出: <html><body><p>This is a paragraph.</p></body></html>
}
}
7. 遍历 HTML 元素
示例:遍历并操作多个元素
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class JsoupIterateExample {
public static void main(String[] args) {
String html = "<html><body><p>First paragraph</p><p>Second paragraph</p></body></html>";
Document doc = Jsoup.parse(html);
// 遍历所有 <p> 标签并输出文本内容
for (Element p : doc.select("p")) {
System.out.println("Paragraph: " + p.text());
}
// 输出:
// Paragraph: First paragraph
// Paragraph: Second paragraph
}
}
8. 抓取带表格的 HTML
示例:抓取并解析 HTML 表格数据
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupTableParsing {
public static void main(String[] args) {
String html = "<html><body><table>"
+ "<tr><th>Name</th><th>Age</th></tr>"
+ "<tr><td>John</td><td>25</td></tr>"
+ "<tr><td>Jane</td><td>30</td></tr>"
+ "</table></body></html>";
Document doc = Jsoup.parse(html);
// 获取所有表格行
Elements rows = doc.select("table tr");
// 遍历每一行,输出表格数据
for (Element row : rows) {
Elements cols = row.select("td");
if (!cols.isEmpty()) {
System.out.println(cols.get(0).text() + " is " + cols.get(1).text() + " years old.");
}
}
// 输出:
// John is 25 years old.
// Jane is 30 years old.
}
}
9. 处理 HTTP Cookies 和 User-Agent
示例:设置 Cookie 和 User-Agent
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
public class JsoupWithCookies {
public static void main(String[] args) throws IOException {
Document doc = Jsoup.connect("https://example.com")
.cookie("user", "JohnDoe") // 设置 cookie
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)") // 设置 User-Agent
.get();
// 打印页面标题
System.out.println("Page Title: " + doc.title());
}
}
10. 异步请求和超时设置
示例:设置连接超时
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;
public class JsoupTimeoutExample {
public static void main(String[] args) {
try {
// 设置连接超时时间(单位:毫秒)
Document doc = Jsoup.connect("https://example.com")
.timeout(5000) // 设置5秒超时
.get();
// 输出网页标题
System.out.println("Page Title: " + doc.title());
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结
- 解析 HTML: 使用
Jsoup.parse()来解析 HTML 字符串,或使用Jsoup.connect()从 URL 获取 HTML。 - 选择元素: 使用
select()方法根据 CSS 选择器选择元素,类似于 jQuery 的语法。 - 修改内容: 使用
text()、html()、attr()等方法来修改 HTML 元素的内容或属性。 - 操作表格和列表: 可以轻松提取表格数据和其他有序列表数据。
- 抓取网页:
Jsoup可以与网络请求结合,抓取并解析网页内容,还支持设置 HTTP headers、cookies 和 timeout 等。
这些示例涵盖了 Jsoup 中的常见操作,Jsoup 是一个非常强大的工具,在处理 HTML 和网页抓取时提供了很多便利的功能。你可以根据需要选择合适的方法来解析、修改和操作 HTML 内容。