jsoup解析html之table表格

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.pswp.cn/news/35600.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35600.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35600.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python Opencv實踐 - 圖像旋轉

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#圖像旋轉 #Opencv中的旋轉&#xff0c;首先通過cv.getRotationMatrix2D獲得旋轉矩陣 #cv.getRotationMatrix2D(center,ang…

Mr. Cappuccino的第62杯咖啡——Spring之Bean的生命周期

Spring之Bean的生命周期 Aware接口項目結構項目代碼運行結果源代碼使用場景 InitializingBean接口項目結構項目代碼運行結果源代碼 BeanFactoryPostProcessor接口項目結構項目代碼運行結果源代碼 Bean的生命周期項目結構項目代碼運行結果源代碼 Aware接口 實現Aware接口是為了…

微信小程序實現圖片多點裁剪

話不多說&#xff0c;直接上代碼 1、頁面布局 <view class"buttons" style"height: 50px;"><view class"upload btn" style"background-color: #d18118;"bindtap"uploadImage"> 上傳圖片 </view><vie…

機器視覺項目流程和學習方法

機器視覺項目流程&#xff1a; 00001. 需求分析和方案建立 00002. 算法流程規劃和業務邏輯設計 00003. 模塊化編程和集成化實現 00004. 調試和優化&#xff0c;交付客戶及文檔 學習機器視覺的方法&#xff1a; 00001. 實戰學習&#xff0c;結合項目經驗教訓 00002. 學習…

c++參數傳遞

函數的參數傳遞 指的是形參與實參結合的過程&#xff0c;其基本方式包括值傳遞和引用傳遞兩種。 值傳遞 該方法把參數的實際值復制給函數的形式參數。在這種情況下&#xff0c;修改函數內的形式參數對實際參數沒有影響 #include<iostream> using namespace std;void swap…

NAS搭建指南二——影視資源中心

1. 刮削 這一部分是利用 tinyMediaManager 進行影視資源的評分、簡介以及圖片的搜集工作tinyMediaManager 官方網站地址下載及安裝過程&#xff1a;略我的主要修改的設置項如下所示&#xff1a; 使用方法&#xff1a; a. 點擊更新媒體庫 b. 選擇影片–>右鍵單擊–>…

時序預測 | MATLAB實現基于BiLSTM雙向長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于BiLSTM雙向長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于BiLSTM雙向長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 Matlab實現BiLST…

C++中的回調函數

1.普通函數作為回調函數 #include <iostream>void programA_FunA1() { printf("Iam ProgramA_FunA1 and be called..\n"); }void programA_FunA2() { printf("Iam ProgramA_FunA2 and be called..\n"); }void programB_FunB1(void (*callback)()) {…

年之年的選擇,組裝版

組件&#xff1a;<!--* Author: liuyu liuyuxizhengtech.com* Date: 2023-02-01 16:57:27* LastEditors: wangping wangpingxizhengtech.com* LastEditTime: 2023-06-30 17:25:14* Description: 時間選擇年 - 年 --> <template><div class"year-range-pick…

04.利用Redis國邏輯過期實現緩存功能---解決緩存擊穿

學習目標&#xff1a; 提示&#xff1a;學習如何利用Redis邏輯過期實現添加緩存功能解決緩存擊穿 學習產出&#xff1a; 緩存擊穿講解圖&#xff1a; 解決方案&#xff1a; 采用互斥鎖采用邏輯過期 1. 準備pom環境 <dependency><groupId>org.springframework…

⑤ Axios網絡請求

Axios安裝 cnpm install --save axios post請求需要用到的&#xff1a; cnpm install --save querystring(用來轉換格式的) 引入 一般是全局引入&#xff0c;在main.js中引入 全局引入后的get和post方式使用 get請求方式 post請求方式 先引入&#xff1a; axios封裝…

STM32 定時器自動重裝載寄存器ARR帶來的影響,ARPE0和1區別

ARR是啥 自動重載寄存器是預裝載的。對自動重載寄存器執行寫入或讀取操作時會訪問預裝載寄存器。預裝載寄存器的內容既可以直接傳送到影子寄存器&#xff0c;也可以在每次發生更新事件 (UEV) 時傳送到影子寄存器&#xff0c;這取決于 TIMx_CR1 寄存器中的自動重載預裝載使能位 …

Go和Java實現中介者模式

Go和Java實現中介者模式 下面通過一個同事之間相互通信的例子來說明中介者模式的使用。 1、中介者模式 中介者模式是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類&#xff0c;該類通常處理不同類之間的 通信&#xff0c;并支持松耦合&#xff0c;使代碼…

1.作用域

1.1局部作用域 局部作用域分為函數作用域和塊作用域。 1.函數作用域: 在函數內部聲明的變量只能在函數內部被訪問&#xff0c;外部無法直接訪問。 總結&#xff1a; (1)函數內部聲明的變量&#xff0c;在函數外部無法被訪問 (2)函數的參數也是函數內部的局部變量 (3)不同函數…

Redis——三個特殊的數據類型+事務

概述 全稱為遠程字典服務。 Redis——基礎篇(包含redis在云服務上的docker化安裝和連接以及常用命令)_連接docker中的redis_北嶺山腳鼠鼠的博客-CSDN博客 Redis能干什么&#xff1f; 1.內存存儲、持久化&#xff0c;內存中是斷電即失&#xff0c;因此持久化很重要&#xff…

【LVS-NAT配置】

配置 node1&#xff1a;128&#xff08;客戶端&#xff09; node2&#xff1a;135&#xff08;調度器&#xff09; RS&#xff1a; node3&#xff1a;130 node4&#xff1a;132 node2添加網絡適配器&#xff08;僅主機模式&#xff09; [rootnode2 ~]# nmtui[rootnode2 ~]#…

ETLCloud+MaxCompute實現云數據倉庫的高效實時同步

MaxCompute介紹 MaxCompute是適用于數據分析場景的企業級SaaS&#xff08;Software as a Service&#xff09;模式云數據倉庫&#xff0c;以Serverless架構提供快速、全托管的在線數據倉庫服務&#xff0c;消除了傳統數據平臺在資源擴展性和彈性方面的限制&#xff0c;最小化用…

歐拉公式之證明

首先&#xff0c;我們考慮復數函數的泰勒級數展開式。對于任意一個復數函數f(z)&#xff0c;我們可以將其在za處進行泰勒級數展開&#xff1a; f(z) f(a) f(a)(z-a) f(a)(z-a)^2/2! f(a)(z-a)^3/3! ... 其中f(a)表示f(z)在za處的導數&#xff0c;f(a)表示f(z)在…

從零開始學Python(三)函數與lambda表達式

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下來看看由輝輝所寫的關于Python的相關操作吧 目錄 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.函數 1.函數與方法的區別 2.函數的定…

[PaddlePaddle] [學習筆記] [上] 計算機視覺(卷積、卷積核、卷積計算、padding計算、BN、縮放、平移、Dropout)

1. 計算機視覺的發展歷程 計算機視覺作為一門讓機器學會如何去“看”的學科&#xff0c;具體的說&#xff0c;就是讓機器去識別攝像機拍攝的圖片或視頻中的物體&#xff0c;檢測出物體所在的位置&#xff0c;并對目標物體進行跟蹤&#xff0c;從而理解并描述出圖片或視頻里的場…