当前位置: 首页 > article >正文

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();
        }
  • 效果展示:
    在这里插入图片描述

觉得有帮助别忘点个赞哈:)


http://www.kler.cn/a/377547.html

相关文章:

  • 小菜家教平台:基于SpringBoot+Vue打造一站式学习管理系统
  • contenteditable实现需要一个像文本域一样的可编辑框
  • 【MySQL死锁一】
  • H5开发指南|掌握核心技术,玩转私域营销利器
  • C++20 STL CookBook2 更强大的编译时 + 安全比较 + spaceship比较符
  • Java之包,抽象类,接口
  • Linux云计算 |【第五阶段】CLOUD-DAY5
  • 2.WebSocket进阶: 深入探究实时通信的最佳实践与优化技巧
  • Rust 力扣 - 1652. 拆炸弹
  • 深入理解跨域资源共享(CORS)安全问题原理及解决思路
  • C++编程法则365天一天一条(27)std::initializer_list 轻量级初始化列表
  • OKHTTP断点续传
  • 【运输&加载码头】仓库新卸物料检测系统源码&数据集全套:改进yolo11-DRBNCSPELAN
  • 利用Docker Compose构建微服务架构
  • 90%的读者都惊呆了!一键生成的微头条,连作者都认不出来是AI作品?
  • Linux常见指令大全(必要+知识点)
  • 设计模式08-行为型模式(命令模式/迭代器模式/观察者模式/Java)
  • 免公网服务器实现DDNS功能(API动态修改DNS解析IP)
  • webstorm 项目如何配置支持 nodejs
  • 怎么提取视频里的音频?关于提取视频里音频的几种方法
  • 【含文档】基于ssm+jsp的老年人健康管理系统(含源码+数据库+lw)
  • 移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (4) - 平台适配
  • 计算机视觉和深度学习有什么区别
  • Leetcode21:合并两个有效链表
  • 关于Android Studio Http Proxy设置
  • 力扣排序268题 数字丢失