我有一个html表结构,在主表中有一些数据,在td元素内的嵌套表中有一些数据。
我只需要所需的5个数据(带有** xx **的指示),因此我可以将其作为一行导出到Excel。
<table cellpadding="2" cellspacing="0" width="100%" class="chart">
<tr>
<td>**Text 1**</td>
<td>
<table cellpadding="2" cellspacing="0">
<tr>
<td>some useless data</td>
<td>**Text 2**</td>
</tr>
</table>
</td>
<td>**Text 3**</td>
<td>**Text 4**</td>
<td>**Text 5**</td>
</tr>
</table>
我的代码是这样的:
for (Element row : excel.select("tr")) {
// create row for each tag
header = sheet.createRow(rowCount);
// loop through all th tag
Elements ths = row.select("th");
int count = 0;
for (Element element : ths) {
// set header style
cell = header.createCell(count);
cell.setCellValue(element.text());
cell.setCellStyle(headerStyle);
count++;
}
// now loop through all td tag
Elements tds = row.select("td");
count = 0;
for (Element element : tds) {
if(!element.text().isEmpty()){
cell = header.createCell(count);
cell.setCellValue(element.text());
count++;
}
}
这里的问题是输出不符合预期。
在Excel中看起来像这样:
Row1: Text 1 | Text 2 | useless data | Text 2 | Text 3 | Text 4 | Text 5 |
Row2: useless data | Text 2 |
附加信息:为简化问题,省略了标签。
我想要的是
Row1: Text 1 | Text 2 | Text 3 | Text 4 | Text 5 |
最佳答案
1.两排
我猜excel
是文档还是表格。无论如何,当您选择excel.select("tr")
您还将选择内部表tr
。为了防止这种情况,您需要使css选择器更加具体。如果我假设excel
是文档,则可以这样做
Elements outerTrs = excel.select("table.chart>tbody>tr");
在您的代码的上下文中:
for (Element row : excel.select("table.chart>tbody>tr")) {
说明:
如果不存在,Jsoup将在表内创建一个
tbody
元素。使用选择器,我确保仅选择直接子tr
外部表的元素,我可以执行此操作,因为我知道外部表的类名,并且它看起来是唯一的。2.意外的列数
这是因为您的select
row.select("td")
语句选择了包含内部表的td
。如果只希望没有子元素的tds,则可以使用以下命令:Elements tds = row.select("td");
count = 0;
for (Element element : tds) {
if(!element.text().isEmpty() && element.children().isEmpty()){
count++;
System.out.println("line "+count+" text = '"+element.text()+"'");
}
3.无用数据
要摆脱这种情况,您只需要过滤掉它即可。从您的示例尚不清楚何时存在无用数据。它始终是内部表中的第一个
td
吗?如果是这样,您可以执行此操作(完整解决方案)Document excel = Jsoup.parse(tab);
for (Element row : excel.select("table.chart>tbody>tr")) {
Elements tds = row.select("td");
int count = 0;
Element junkTd = row.select("td table td").first();
for (Element element : tds) {
if(!element.text().isEmpty()
&& element.children().isEmpty()
&& !element.equals(junkTd)){
count++;
System.out.println("line "+count+" text = '"+element.text()+"'");
}
}
}
关于java - 如何从html表及其内部表中提取数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31761562/