Jsoup
是一个非常强大的 Java 库,用于解析 HTML 文档并提取数据。它提供了简洁的 API 和灵活的选择器语法,使得解析 HTML 变得非常方便。以下是一些常见的使用方法和示例代码,帮助你快速上手 Jsoup
。
一、Jsoup 的基本用法
(一)解析 HTML 文档
Jsoup
可以解析字符串形式的 HTML,也可以直接从 URL 或文件中加载 HTML 文档。
1. 从字符串解析 HTML
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><head><title>Test</title></head><body><p>Hello, Jsoup!</p></body></html>";
Document doc = Jsoup.parse(html);
System.out.println(doc.title()); // 输出:Test
}
}
2. 从 URL 加载 HTML
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupExample {
public static void main(String[] args) {
try {
Document doc = Jsoup.connect("https://example.com").get();
System.out.println(doc.title()); // 输出页面标题
} catch (Exception e) {
e.printStackTrace();
}
}
}
(二)选择器语法
Jsoup
提供了类似 CSS 的选择器语法,可以非常方便地选择特定的 HTML 元素。
1. 按标签选择
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><p>Hello, Jsoup!</p><a href='https://example.com'>Link</a></body></html>";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text()); // 输出:Hello, Jsoup!
}
}
}
2. 按类选择
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><div class='content'>Content</div></body></html>";
Document doc = Jsoup.parse(html);
Elements contents = doc.select("div.content");
for (Element content : contents) {
System.out.println(content.text()); // 输出:Content
}
}
}
3. 按 ID 选择
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><div id='main'>Main Content</div></body></html>";
Document doc = Jsoup.parse(html);
Element mainContent = doc.select("#main").first();
System.out.println(mainContent.text()); // 输出:Main Content
}
}
4. 组合选择器
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><div class='content'><p>Hello, Jsoup!</p></div></body></html>";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("div.content > p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text()); // 输出:Hello, Jsoup!
}
}
}
(三)提取元素内容
Jsoup
提供了多种方法来提取元素的内容,包括文本、属性和 HTML。
1. 提取文本
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><p>Hello, Jsoup!</p></body></html>";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text()); // 输出:Hello, Jsoup!
}
}
}
2. 提取属性
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><a href='https://example.com'>Link</a></body></html>";
Document doc = Jsoup.parse(html);
Elements links = doc.select("a");
for (Element link : links) {
System.out.println(link.attr("href")); // 输出:https://example.com
}
}
}
3. 提取 HTML
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><div><p>Hello, Jsoup!</p></div></body></html>";
Document doc = Jsoup.parse(html);
Elements divs = doc.select("div");
for (Element div : divs) {
System.out.println(div.html()); // 输出:<p>Hello, Jsoup!</p>
}
}
}
(四)遍历元素
可以使用 forEach
或 for
循环来遍历选择的元素集合。
1. 使用 forEach
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><p>Hello, Jsoup!</p><p>Another paragraph.</p></body></html>";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
paragraphs.forEach(paragraph -> {
System.out.println(paragraph.text());
});
}
}
2. 使用 for
循环
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><p>Hello, Jsoup!</p><p>Another paragraph.</p></body></html>";
Document doc = Jsoup.parse(html);
Elements paragraphs = doc.select("p");
for (Element paragraph : paragraphs) {
System.out.println(paragraph.text());
}
}
}
(五)处理相对 URL
在解析 HTML 时,经常会遇到相对 URL。Jsoup
提供了方法将相对 URL 转换为绝对 URL。
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) {
String html = "<html><body><a href='/path/to/resource'>Link</a></body></html>";
Document doc = Jsoup.parse(html, "https://example.com");
Elements links = doc.select("a");
for (Element link : links) {
System.out.println(link.absUrl("href")); // 输出:https://example.com/path/to/resource
}
}
}
二、完整示例:解析 1688 商品详情
以下是一个完整的示例,展示如何使用 Jsoup
解析 1688 商品详情页的内容。
java
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class AlibabaCrawler {
public static void main(String[] args) {
String url = "https://detail.1688.com/offer/123456789.html";
try {
Document doc = Jsoup.connect(url).get();
System.out.println("商品标题: " + doc.title());
Elements productInfo = doc.select("div.product-info");
for (Element info : productInfo) {
System.out.println("商品名称: " + info.select("h1").text());
System.out.println("商品价格: " + info.select("span.price").text());
System.out.println("商品描述: " + info.select("div.description").text());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、注意事项和建议
(一)遵守网站规则
在爬取数据时,务必遵守 1688 的 robots.txt
文件规定和使用条款,不要频繁发送请求,以免对网站造成负担或被封禁。
(二)处理异常情况
在编写爬虫程序时,要考虑到可能出现的异常情况,如请求失败、页面结构变化等。可以通过捕获异常和设置重试机制来提高程序的稳定性。
(三)数据存储
获取到的商品信息可以存储到文件或数据库中,以便后续分析和使用。
(四)合理设置请求频率
避免高频率请求,合理设置请求间隔时间,例如每次请求间隔几秒到几十秒,以降低被封禁的风险。
四、总结
通过上述步骤和示例代码,你可以轻松地使用 Jsoup
解析 HTML 文档并提取所需的数据。Jsoup
提供了简洁的 API 和灵活的选择器语法,使得解析 HTML 变得非常方便。希望这个教程对你有所帮助!