jsoup解析html之table表格

news2024/12/28 18:47:55

jsoup解析html之table表格

jsoup说明

一款Java 的HTML解析器
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

主要功能

  1. 从一个URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS选择器来查找、取出数据;
  3. 可操作HTML元素、属性、文本;

需求说明

现在需要从上游过来一批数据,我们解析之后做一些逻辑处理,批量录入数据库;这些数据就是excel,一条一条的,只不过它不是标准的xls或者xlsx形式,而是处理过的html格式加工成xls格式,如果我们使用easypoi或者easyexcel解析会出现错误提示java.io.IOException: Your InputStream was neither an OLE2 stream, nor an OOXML stream,简而言之就是,这两个解析框架不识别,不是标准的xls或者xlsx,解决方法就是从上游导出的数据,先保存为标准的xls后者xlsx形式不会出现问题,但是,但是,现在需要从程序上进行控制。

代码操作

核心api

Jsoup
The core public access point to the jsoup functionality.
Parse HTML into a Document. The parser will make a sensible, balanced document tree out of any HTML.

Document :文档对象。每份HTML页面都是一个文档对象,Document 是 jsoup 体系中最顶层的结构。
Element:元素对象。一个 Document 中可以着包含着多个 Element 对象,可以使用 Element 对象来遍历节点提取数据或者直接操作HTML。
Elements:元素对象集合,类似于List。

核心方法

eachText()

    /**
     * Get the text content of each of the matched elements. If an element has no text, then it is not included in the
     * result.
     * @return A list of each matched element's text content.
     * @see Element#text()
     * @see Element#hasText()
     * @see #text()
     */
    public List<String> eachText() {
        ArrayList<String> texts = new ArrayList<>(size());
        for (Element el: this) {
            if (el.hasText())
                texts.add(el.text());
        }
        return texts;
    }

select()

    /**
     * Find matching elements within this element list.
     * @param query A {@link Selector} query
     * @return the filtered list of elements, or an empty list if none match.
     */
    public Elements select(String query) {
        return Selector.select(query, this);
    }

1.select()方法在Document、Element或Elements对象中都可以使用,而且是上下文相关的,因此可实现指定元素的过滤,或者采用链式访问。
2.select() 方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。
在这里插入图片描述


	// 从文件流中获取html解析
    public static Document parse(InputStream in, String charsetName, String baseUri) throws IOException {
        return DataUtil.load(in, charsetName, baseUri);
    }
    // 从文件中获取html解析
    public static Document parse(File in, String charsetName) throws IOException {
        return DataUtil.load(in, charsetName, in.getAbsolutePath());
    }
    
    public static Document parse(File in, String charsetName, String baseUri) throws IOException {
        return DataUtil.load(in, charsetName, baseUri);
    }
    
   public static Document parse(InputStream in, String charsetName, String baseUri, Parser parser) throws IOException {
        return DataUtil.load(in, charsetName, baseUri, parser);
    }

package com.geekmice.springbootselfexercise.utils;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import com.geekmice.springbootselfexercise.exception.UserDefinedException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.formula.functions.T;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @BelongsProject: spring-boot-self-exercise
 * @BelongsPackage: com.geekmice.springbootselfexercise.utils
 * @Author: pingmingbo
 * @CreateTime: 2023-08-13  17:16
 * @Description: 解析html
 * @Version: 1.0
 */
@Slf4j
public class ParseHtmlUtil {

    public static final String ERROR_MSG = "error mg:【{}】";

    /**
     * @param inputStream 文件流
     * @return 解析好的数据list
     * @throws IOException
     * @description 根据文件流解析html格式的excel
     * 问题说明:去除第一行标题,空行,空格,空指针问题
     */
    public static List<String> parseHandle(InputStream inputStream) {
        Document document;
        try {
            document = Jsoup.parse(inputStream, StandardCharsets.UTF_8.toString(), "");
        } catch (IOException e) {
            log.error(ERROR_MSG, e);
            throw new UserDefinedException(e.toString());
        }
        Elements trList = document.select("table").select("tr");
        List<String> abcList = trList.eachText();
        if (CollectionUtils.isEmpty(abcList)) {
            throw new UserDefinedException("解析文件:文件内容不存在");
        }
        abcList.remove(0);
        return abcList;
    }


}

效果展示

在这里插入图片描述

{
  "msg": "操作成功",
  "code": 200,
  "data": [
    "2023-07-28 00:15 上海 购方 0 0",
    "2023-07-28 00:30 上海 购方 0 0",
     ....
    "2023-07-28 23:00 四川主网 售方 333.25 225.94",
    "2023-07-28 23:15 四川主网 售方 463.25 224.16",
    "2023-07-28 23:30 四川主网 售方 463.25 224.16",
    "2023-07-28 23:45 四川主网 售方 463.25 224.16",
    "2023-07-28 24:00 四川主网 售方 587.79 213.53"
  ]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac M2 Pro安装使用Cocoapods

Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发&#xff0c;所以在新电脑上安装Cocoapods 在升级gem&#xff0c;sudo gem update --system&#xff0c;和安装cocoapods时都遇到如下的提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM)Operation not per…

【MybatisPlus】LambdaQueryWrapper和QueryWapper的区别

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

input 设置type=“number“,鼠标悬停关闭提示语

一、问题 最近刚发现input 设置type"number"之后&#xff0c;鼠标悬停会出现提示语&#xff1a;请输入有效值。两个最接近的有效值分别为xx和xx。想要输入的值确实为number格式&#xff0c;又可以输入小数&#xff0c;不限制小数位&#xff0c;所以要把这讨厌的提示去…

最小路径和——力扣64

文章目录 题目描述动态规划题目描述 动态规划 class Solution {public:int minPathSum(vector<vector<int>>

WebAPIs 第四天

1.日期对象 2.节点操作 3.M端事件 4.JS插件 一.日期对象 实例化时间对象方法时间戳 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 1.1 实例化 ① 概念&#xff1a;在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 …

Controller是线程安全吗?如何实现线程安全

测试是否是线程安全 RequestMapping("/test") RestController public class TestController {//1、定义num&#xff0c;判断不同线程访问的时候&#xff0c;num的返回结果是否一致private Integer num0;/*** 2、定义两个方法*/GetMapping("/count1")publi…

一个注解实现分布式锁

文章首发微信公众号《java知路》 分布式锁原理 分布式锁是一种用于在分布式系统中协调多个节点并保证数据一致性的机制。它的目的是在分布式环境下实现互斥访问共享资源&#xff0c;以防止多个节点同时对共享资源进行修改或读取&#xff0c;从而保证数据的正确性和一致性。 实…

单向-->不带头-->非循环链表(简称:单链表)

目录 一、链表的介绍 1.链表的概念 2.单链表的节点类型 3.单链表简图 二、单链表的增删查改 1.单链表的头插 2.单链表的尾插 3.单链表的头删 4.单链表的尾删 5.单链表pos位置之后插入一个节点 6.单链表删除pos位置后的一个节点 一、链表的介绍 1.链表的概念 链表是一…

如何搬运订单(1688)

目录 下载安装与运行 任务描述 搬运具体要求&#xff08;示例&#xff09; 订单导出操作过程 搜索指定范围的订单 选择要导出的订单数据 完整的导出动画演示 切换到另一个账号 B账号批量下单的要求 下单步骤 下单设置 为啥选加采购车而不是立即下单 为啥要选自动情…

Java-方法

在编程中&#xff0c;我们也可以将频繁使用的代码封装成"帖子"(方法)&#xff0c;需要时直接拿来链接 方法就是一个代码片段. 类似于 C 语言中的 “函数” 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 …]){ 方法体代码; [return 返回值]; } 这里比得C语言…

关于视频人工智能/机器视觉创业商业模式的一些思考

今年开始了我的第二次创业&#xff0c;第一次创业大家看我以前的博客就知道了&#xff0c;做音视频流媒体相关技术的&#xff0c;现在公司也已经是安徽省专精特新中小企业了&#xff0c;还好是“中小企业”&#xff0c;如果直接是专精特新企业&#xff0c;我就可以不用来视频人…

地理测绘基础知识(2)-椭球最短距离计算

在上一篇中&#xff0c;我们介绍了ECEF坐标系和经纬度的互换。 本篇&#xff0c;主要介绍已知A\B两个点的经纬度&#xff0c;如何求取椭球上的最短距离、路径。 在标准椭球面上&#xff0c;从A点运动到B点&#xff0c;距离如何&#xff0c;轨迹、每个阶段的方向又是如何呢&am…

consul安装启动流程

普通软件包安装 首先cd /opt &#xff0c;将安装包放到该目录下 下载consul安装包 进入consul官网找到自己开发平台对应的安装包下载 https://www.consul.io/downloads.html 或使用命令 wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip (如果…

【K8S系列】深入解析k8s网络插件—Weave Net

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 Kubernetes (k8s) 是一个容器编…

MySQL数据库练习

目录 表结构 建表 插入数据 1、用SQL语句创建学生表student&#xff0c;定义主键&#xff0c;姓名不能重名&#xff0c;性别只能输入男或女&#xff0c;所在系的默认值是 “计算机”。 2、修改student 表中年龄&#xff08;age&#xff09;字段属性&#xff0c;数据类型由…

开源数据库Mysql_DBA运维实战 (修改root密码)

MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法&#xff0c;大家可以可以根据的自己的情况自由选择&#xff0c;希望对大家有所帮助 方法1&#xff1a; 用SET PASSWORD命令 首先登录MySQL。 格式&#xff1a;mysql> set pass…

linux 学习————LNMP之分布式部署

目录 一、概述 二、LNMP环境部署 三、配置nginx 四、 配置php使nginx能够解析.php 五、配置mysql 六、配置discuz进行登录论坛访问测试 一、概述 LNMP代表 Linux、Nginx、MySQL、PHP&#xff0c;是一种常用的服务器架构。它由以下组件组成&#xff1a; Linux&#xff1a;作…

【2023新教程】树莓派4B开机启动-树莓派第一次启动-树莓派不使用显示器启动-树莓派从购买到启动一步一步完全版!

背景 闲来无事&#xff0c;在咸鱼上买了一个树莓派4B。买来配件都十分齐全&#xff0c;于是就想着启动来测试一下。下面是树莓派无显示器第一次启动的全过程&#xff0c;包含安装系统。 网上的教程大多需要额外使用显示器、鼠标、键盘之类的外设。然而&#xff0c;树莓派本身就…

阿里云服务器是什么?阿里云服务器有什么优缺点?

阿里云服务器是什么&#xff1f;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;云服务器可以降低IT成本提升运维效率&#xff0c;免去企业或个人前期采购IT硬件的成本&#xff0c;阿里云服务器让用户像使用水、电、天然气等公共资源一样便捷、高效地使用服务器…

[数据集][目标检测]骑电动车摩托车不戴头盔数据集VOC格式1385张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1385 标注数量(xml文件个数)&#xff1a;1385 标注类别数&#xff1a;2 标注类别名称:["y","n&q…