java jsoup解析豆瓣电影数据html实战教程
什么是Jsoup
Jsoup 是一个开源 Java 库,它提供了一个直观的 API,可使用 DOM API 方法获取 URL 并提取和处理数据。 作为一个多功能库,Jsoup 支持 CSS 选择器和 XPath,它们是识别和选择 HTML 文档中元素的强大选项。 此外,Jsoup 还能处理畸形的 HTML,如包含无效或不完整标记的 HTML,这使它成为从各类网站中提取数据的重要工具。
官网:https://jsoup.org/cookbook/extracting-data/selector-syntax
使用 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();
}
- 效果展示: