什么是Jsoup
Jsoup 是一个开源 Java 库,它提供了一个直观的 API,可使用 DOM API 方法获取 URL 并提取和处理数据。 作为一个多功能库,Jsoup 支持 CSS 选择器和 XPath,它们是识别和选择 HTML 文档中元素的强大选项。 此外,Jsoup 还能处理畸形的 HTML,如包含无效或不完整标记的 HTML,这使它成为从各类网站中提取数据的重要工具。
使用 Jsoup 解析 HTML
要使用 Jsoup 解析 HTML,请将获取的数据加载到 Document 对象中,该对象将 HTML 呈现在 DOM 树中。然后,浏览文档并选择所需的信息。以下是关于如何在 Java 中解析 HTML 的 Jsoup 分步教程。作为练习,您将从豆瓣电影榜单站点中提取数据。
步骤1:添加jsoup依赖
<dependency>
<!-- jsoup HTML parser library @ https://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
步骤2:获取html
要提取您将在本教程中解析的 HTML 源文件,请使用内置 Java 模块 HttpClient 向目标网页 (https://movie.douban.com/chart) 发出 GET 请求并检索响应。利用hutool的HttpUtil工具类可以一行代码搞定!
添加hutool依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.21</version>
</dependency>
HttpUtil.get("https://movie.douban.com/chart");
步骤3:提取电影数据
Jsoup 允许您使用 CSS 选择器或 XPath 选择元素。虽然 CSS 选择器通常因其易用性和更简单的语法而受到青睐,但您的选择取决于项目的需求和用例。
本文演示CSS选择器方式提取:
- 提取第一个电影标题
Document doc = Jsoup.parse(t);
Element titleElement = doc.select("div.pl2 > a").first();
String productTitle = titleElement.text();
System.out.println("Product Title: " + productTitle);
输出:Product Title: 某种物质 / 完美物质(港) / 惧裂(台)
步骤4:提取电影列表数据
对步骤3进行扩展,将第一页的电影数据信息全部提取出来,组成一个电影数据列表。
- 创建电影实体类
@Data
public class Movie {
private String title;
private String url;
private String img;
private String rating;
private String desc;
private String ratingCount;
}
- 完善解析代码
List<Movie> movieList = new ArrayList<>();
doc.select("tr.item").forEach(e -> {
Movie movie = new Movie();
Elements tds = e.select("td");
if(tds.size() == 2){
Element imgElement = tds.get(0);
Element bodyElement = tds.get(1);
// 获取链接
movie.setUrl(imgElement.select(".nbg").attr("href"));
// 获取图片
movie.setImg(imgElement.select(".nbg > img").attr("src"));
// 获取标题
movie.setTitle(bodyElement.select(".pl2 > a").text());
// 描述
movie.setDesc(bodyElement.select(".pl").text());
// 评分
movie.setRating(bodyElement.select(".star > span.rating_nums").text());
// 打分人数
movie.setRatingCount(bodyElement.select(".star > span.pl").text());
}
movieList.add(movie);
});
步骤5:导出电影数据到CSV
添加pom依赖:
<!-- https://mvnrepository.com/artifact/com.opencsv/opencsv -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.9</version>
</dependency>
导出代码:
// 写入csv文件
try (CSVWriter csvWriter = new CSVWriter(new FileWriter("d:/tmp/products.csv"))) {
// write header
String[] header = {"名称", "详情", "封面", "摘要", "评分", "评论人数"};
csvWriter.writeNext(header);
// write data
for (Movie movie : movieList) {
String[] data = {movie.getTitle(), movie.getUrl(), movie.getImg(), movie.getDesc(), movie.getRating(), movie.getRatingCount()};
csvWriter.writeNext(data);
}
} catch (IOException e) {
e.printStackTrace();
}
- 效果展示: