当前位置: 首页 > 编程日记 > 正文

java 解决Html table的rowspan问题(osc处女作)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

假如有如下html代码需要解析

<table border="1"><tr><td rowspan="3">1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>2</td><td>2</td><td>2</td></tr><tr><td>3</td><td>3</td><td>3</td></tr>
</table>

我们需要以每一行为一个对象的解析过程

理想输出的结果是

1111

1222

1333

再假如有下面html

<table border="1"><tr><td rowspan="3">1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>2</td><td rowspan="2">2</td><td>2</td></tr><tr><td>3</td><td>3</td></tr>
</table>

我们得到理想的结果是

1111

1222

1323

如果每次都按照这样的结果输出,就符合我们的理想, 把rowspan掉的给恢复成无rowspan的table解析起来就比较方便了

下面说解决思路, 首先我们用一个二维的String数组来表示无rowspan table的行和列

上面的我们可以声明String[][] table=new String[3][4];

表示三行四列的table

下面我开始遍历html代码的每一行,行下标用i来表示,在行的遍历代码中我们遍历每行的列,在遍历的同时我们判断这个列是不是有rowspan属性,如果有在二维数组中给i+1行的当前列(通过当前列的下标可以访问到)赋值为i行的当前单元格的值,这个rowspan被顺利读取,最后的二维数组就是我们得到的没有rowspan的table。注意在给每个单元格赋值前,需要判断当前行和当前列是不是为空的, 如果不为空则向列+1的单元格赋值 , 依此往复知道赋值成功

下面贴上我的代码,用到了jsoup(解析html利器嘛 。)

package bank.html;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;public class Table {private List<Tr> trs;private String html;private String[][] table;private boolean isHtml;public Table(String tableHtml){html=tableHtml;}public void parse(){Document document=Jsoup.parse(html);Elements trsE = document.select("tr");Elements firstTds=trsE.get(0).select("td");table = new String[trsE.size()][firstTds.size()];for (int row = 0; row < table.length; row++) {Element tr = trsE.get(row);Elements tds = tr.select("td");int column = 0;for (Element td : tds) {if (td.hasAttr("rowspan")) {int rowspan = Integer.parseInt(td.attr("rowspan"));td.removeAttr("rowspan");int endRow = rowspan + row - 1;for (int startColumn=column; endRow > row; endRow--) {boolean flag = true;int columnA=startColumn;while (flag) {if (table[endRow][columnA] == null) {table[endRow][columnA] = isHtml?td.toString():td.html();flag=false;startColumn=columnA;} else {columnA++;}}}}boolean runing = true;do {if (table[row][column] == null) {runing = false;table[row][column] = isHtml?td.toString():td.html();} else {runing = true;}column++;} while (runing);}}trs=new ArrayList<Tr>();for (String[] strings : table) {Tr tr=new Tr();List<Td> tds=new ArrayList<Td>();for (String string : strings) {Td td=new Td();td.setContent(string);tds.add(td);}tr.setTds(tds);trs.add(tr);}}public List<Tr> getTrs(){return trs;}public String getHtml(){return html;}public int getTrCount(){return trs.size();}public void isHtml(boolean v){isHtml=v;}public static void main(String[] args) throws IOException {Document document=Jsoup.parse(new File("table.html"), "utf-8");Elements trs=document.select("tr");System.out.println(trs.size());Table table=new Table("<table>"+trs.toString()+"</table>");table.parse();for(Tr trss:table.getTrs()){System.out.println("行开始");for(Td td:trss.getTds()){System.out.println(td.getContent());}System.out.println("行结束");}}
}
package bank.html;import java.util.List;public class Tr {private List<Td> tds;public List<Td> getTds() {return tds;}public void setTds(List<Td> tds) {this.tds = tds;}}

package bank.html;public class Td {private String content;public String getContent() {return content;}public void setContent(String content) {this.content = content;}
}

可以用上面的html代码测试,可能我描述的不够清楚,大家代码运行下就会明白的。这是我在OSC的处作,其中可能会存在问题,欢迎各路人批评指正。

转载于:https://my.oschina.net/u/725518/blog/90704

相关文章:

基于C++的OpenCV常用函数

C版本的好处&#xff1a; 1、在于可以尽量避免使用指针这种危险的东西&#xff1b; 2、不用费心去release资源了&#xff0c;因为在其destructor里面&#xff0c;系统会自动帮你搞定。 3、在某些情况下会比C版本运行速度快。 在文件中包含 using namespace cv; 1. i…

基于GAN的图像水印去除器,效果堪比PS高手

作者 | 李翔转载自视说AI&#xff08;ID:techtalkai&#xff09;简介&#xff1a;李翔&#xff0c;国内某互联网大厂AI民工&#xff0c;前携程酒店图像技术负责人&#xff0c;计算机视觉和深度学习重度爱好者&#xff0c;在ICCV和CVPR等会议上发表论文十余篇。写在前面当前互联…

Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

作者 | 机智的王知无转载自大数据技术与架构&#xff08;ID: import_bigdata&#xff09;一、Flink SQL 背景Flink SQL 是 Flink 实时计算为简化计算模型&#xff0c;降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。自 2015 年开始&#xff0c;阿里巴巴开始…

SQL SERVER中ROLLUP的用法

cube操作符 要使用cube&#xff0c;首先要了解group by 其实cube和rollup区别不太大&#xff0c;只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别&#xff0c; cube将返回的更多的可能组合。如果在 group by 子句中有n个列或者是有n个表达式的话&#xff0c; s…

Mybait缓存机制

MyBatis同大多数ORM框架一样&#xff0c;提供了一级缓存和二级缓存的支持。 一级缓存&#xff1a;其作用域为session范围内&#xff0c;当session执行flush或close方法后&#xff0c;一级缓存会被清空。 二级缓存&#xff1a;二级缓存和一级缓存机制相同&#xff0c;但是可以自…

vs2008常用操作汇总

1、OpenCV2.1环境配置&#xff1a; (1)、Tools-->Options-->Projects and Solutions-->VCDrectories&#xff1a; Show directories for选择include files&#xff0c;加入目录 D:/Program Files/OpenCV2.1/include/opencv &#xff1b;Show directories for选择libra…

深度学习已至“瓶颈”?英特尔:数据处理是一剂良药

【导读】霍金弟子Alan Yuille在前不久发表言论称&#xff0c;至少在计算机视觉领域&#xff0c;深度学习的瓶颈已至。然而&#xff0c;人工智能与大数据的发展相辅相成&#xff0c;数据将会推动人工智能的发展&#xff0c;促进更多技术应用落地&#xff0c;将人工智能带入一个新…

WIN32 C++ 遍历文件夹

转自&#xff1a;http://blog.csdn.net/lizhigang770/archive/2010/11/30/6045242.aspx 一、先介绍一个结构 WIN32_FIND_DATA typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // 文件属性 FILETIME ftCreationTime; // 文件创建时间 FILETIME ft…

UIView淡入淡出动画

小小原创&#xff0c;转载请注明出处&#xff1a;http://iphone.xiaoxiaostudio.net 如果你觉得为某个UIView 加载一个全新的View在这个UIView上面时&#xff0c;想要隐藏时setHidden显得太突兀了&#xff0c;我们可以给它增加一些动画&#xff0c;iOS上默认提供了一些动画&…

sass的继承,混合宏,占位符的用法总结

SCSS中混合宏使用 mixin mt($var){ margin-top: $var; }.block { include mt(5px);span { display:block; include mt(5px); } }extend如何工作 .icon {transition: background-color ease .2s;margin: 0 .5em;}.error-icon {extend .icon;/*错误图标指定的样式... */}.info-i…

js中cookie的使用详细分析

2019独角兽企业重金招聘Python工程师标准>>> JavaScript中的另一个机制&#xff1a;cookie&#xff0c;则可以达到真正全局变量的要求。 cookie是浏览器 提供的一种机制&#xff0c;它将document 对象的cookie属性提供给JavaScript。可以由JavaScript对其进行控制&a…

从事JAVA 20年最终却败给了Python,哭了!

之前遇到一个老师&#xff0c;他从事Java行业20年了&#xff0c;在Python兴起的时候&#xff0c;他周围的其他同行们都在纷纷学习Python方面的知识&#xff0c;连他的学生也问他“老师&#xff0c;你为什么不学Python呢&#xff1f;”。当这位听到学生这个问题的时候&#xff0…

c++删除文件夹

转自&#xff1a;http://blog.csdn.net/sshhbb/archive/2010/12/07/6061029.aspx c语言本身是不能删除文件或文件夹的&#xff0c;他们是windows操作系统里的东西&#xff0c;所以得借助其api函数。 其一&#xff1a;使用shell 接口&#xff1a; void FileDelete(CString di…

解决bootstrap下的图片自适应问题

.img-responsive {display: block; height: auto; max-width: 100%; }转载于:https://www.cnblogs.com/qjuly/p/9809910.html

边缘检测、Hough变换、轮廓提取、种子填充、轮廓跟踪

转自&#xff1a;http://blog.sina.com.cn/s/blog_6c083cdd0100nm4s.html 7.1 边沿检测 我们给出一个模板 和一幅图象 。不难发现原图中左边暗&#xff0c;右边亮&#xff0c;中间存在着一条明显的边界。进行模板操作后的结果如下&#xff1a; 。 可以看出&#xff0c;第3…

JS Array 中 shift 和 pop 的妙用

在 JS Array 中支持两个方法&#xff0c;shift() 和 pop()&#xff0c;分别是指从一个数据中的最前面和最后面删除一个值&#xff0c;并返删除值。看一个示例就明白了&#xff1a; var arr [s,o,f,i,s,h]; arr.shift(); // 返回 s arr; // 目前是 [o,f,i,s,h…

当今主流分割网络有哪些?12篇文章一次带你看完

作者 | 孙叔桥来源 | 转载自有三AI&#xff08;ID: yanyousan_ai&#xff09;本文的12篇文章总结了当前主流的分割网络及其结构&#xff0c;涵盖从编解码结构到解码器设计&#xff1b;从感受野到多尺度融合&#xff1b;从CNN到RNN与CRF&#xff1b;从2D分割到3D分割&#xff1b…

正确生成浮点型的方法,解决sqlachemy Float浮点型的坑,生成float类型时,长度和精度均为0,导致查询不到结果!...

问题描述 在使用flask_sqlachemy时&#xff0c;给price字段选择了Float类型&#xff0c;数据库用的mysql&#xff0c;生成数据库表后&#xff0c;发现 from sqlalchemy import Float,Column price Column(Float,default0.00) 虽然能存储float类型&#xff0c;结果如下 但是查询…

图像轮廓的提取和绘制

转自&#xff1a;http://blog.csdn.net/gnuhpc/archive/2009/06/18/4278105.aspx <>var ultimaFecha ; <>document.write(ultimaFecha); #include "highgui.h" #include "cv.h" #include <iostream> #include <iomanip> using …

上海交大张拳石:神经网络的可解释性,从经验主义到数学建模

作者 | 张拳石来源 | 转载自知乎Qs.Zhang张拳石本来想把题目取为“从炼丹到化学”&#xff0c;但是这样的题目太言过其实&#xff0c;远不是近期可以做到的&#xff0c;学术研究需要严谨。但是&#xff0c;寻找适当的数学工具去建模深度神经网络表达能力和训练能力&#xff0c;…

计算机网络模型到底是七层?五层?四层?

1.Introduction 本篇文章的初衷是在做Android网络开发时经常接触各种协议&#xff0c;比如HTTP、XMPP、HLS、RTSP、TCP等协议&#xff0c;对网络的模型和层次有个直观的了解可以做到心中有数。OSI参考模型是七层&#xff0c;TCP/IP模型是四层&#xff0c;计算机网络&#xff08…

【推荐】使用Ultrapico Expresso学习正则表达式

推荐理由Ultrapico Expresso是我工作中经常使用的一个非常强大的正则表达式构建、测试以及代码生成工具。它能够对你构建的正则表达式进行解析、验证&#xff0c;并输出解析结果&#xff0c;提供性能测试工具&#xff0c;支持C#、VB等代码生成&#xff0c;最重要的是&#xff0…

OpenCV中常用到的轮廓处理函数汇总

转自&#xff1a;http://fsa.ia.ac.cn/opencv-doc-cn/opencv-doc-cn-0.9.7/ref/opencvref_cv.cn.htm ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage,int methodCV_CHAIN_APPROX_SIMPLE,double parameter0, int mi…

《Linux内核原理与分析》第二周作业

反汇编一个简单的C程序 1、实验要求 使用&#xff1a; gcc –S –o test.s test.c -m32 命令编译成汇编代码&#xff0c;对汇编代码进行分析总结。其中test.c的具体内容如下&#xff1a; int g(int x) {return x 3; }int f(int x) {return g(x); }int main(void) {return f(8)…

首次!腾讯全面公开整体开源路线图

6月25日&#xff0c;由Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会在上海举办&#xff0c;腾讯开源联盟主席、腾讯开源管理办公室委员、Apache Member堵俊平首次公开了腾讯整体的开源战略路线图。 堵俊平表示&#xff1a;“腾讯开源提倡‘开放、共享、合力…

201771010111李瑞红《面向对象的程序设计》第八周实验总结

实验八接口的定义与使用 实验时间 2018-10 理论部分 6.1 接口:用interface声明&#xff0c;是抽象方法和常量值定义的集 合。从本质上讲&#xff0c;接口是一种特殊的抽象类。 在Java程序设计语言中&#xff0c;接口不是类&#xff0c;而是对类 的一组需求描述&#xff0c;由常…

崛起的Python,真的影响了76万人?

随着AI的兴起&#xff0c;Python彻底火了。据Stack Overflow调研报告&#xff1a;Python的月活用户已超越了Java、成为第一&#xff0c;全民Python已为“大势所趋”。那么&#xff0c;程序员有必要学Python吗&#xff1f;如何高效掌握Python&#xff1f;程序员为啥要学Python&a…

OpenCV查找轮廓

转自&#xff1a;http://westice.javaeye.com/blog/721225 主要函数是 cvFindContours(tour_buf,storage,&contour,sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); tour_buf 是需要查找轮廓…

非阻塞socket的连接

引用自&#xff1a;http://blog.csdn.net/cccallen/article/details/6619994 连接套接字&#xff0c;阻塞的套接字超时时间很长无法接受&#xff0c;而是用非阻塞套接字时使用的方案也有多种。后者是个比较好的方法 方案1&#xff1a;不断重试&#xff0c;直到连接上或者超时&a…

OpenCV下车牌定位算法实现代码

转自&#xff1a;http://blog.csdn.net/heihei723/archive/2006/05/14/728046.aspx#FeedBack 车牌定位算法在车牌识别技术中占有很重要地位&#xff0c;一个车牌识别系统的识别率往往取决于车牌定位的成功率及准确度。 车牌定位有很多种算法&#xff0c;从最简单的来&#xff0…