繁体   English   中英

使用 Jsoup 从 HTML 表中提取数据

[英]Extract data from HTML table with Jsoup

我想从此表中提取信息:

在此处输入图像描述

此表的 HTML 代码:

<tr>
 <th>Rank</th>
 <th>Level</th>
 <th>IVs (A/D/S)</th>
 <th>CP</th>
 <th class="hidden-sm">Att</th>
 <th class="hidden-sm">Def</th>
 <th class="hidden-sm">Sta</th>
 <th class="hidden-xs">Stat Product</th>
 <th>% Max Stat</th>
</tr>
<tr class="table-danger">
 <td><b>2997</b></td>
 <td>19.0</td>
 <td>12 / 0 / 5</td>
 <td>1496</td>
 <td class="hidden-sm">128.10</td>
 <td class="hidden-sm">101.90</td>
 <td class="hidden-sm">133</td>
 <td class="hidden-xs">1736099</td>
 <td>93.71%</td>
</tr>
<tr>
 <td>1</td>
 <td>19.0</td>
 <td>0 / 14 / 14</td>
 <td>1498</td>
 <td class="hidden-sm">121.11</td>
 <td class="hidden-sm">110.05</td>
 <td class="hidden-sm">139</td>
 <td class="hidden-xs">1852687</td>
 <td>100.00%</td>
</tr>
...

我只能使用以下代码获取此表和行:

Element table = document.select("table").get(0);
Elements rows = table.select("tr");

如何提取这些统计数据? 它应该是:

Rank(2997) | Level (19.0) | IVs (12/0/5) | CP (1496)...

Elements td = rows.select("td");
String stats = td.text();

我会得到一行字符串: 2997 19.0 12 / 0 / 5 1496 128.10 101.90 133 1736099 93.71% 1 19.0 0...而且很难处理信息。

我想,我需要将它们存储为带有这些字段的 Stat object 并将其放入 Arraylist 或 smth 中。

但首先,我需要更顺利地提取这些数据,并且不要将所有内容放在一条线上。 我需要 Jsoup 的力量。

你在正确的轨道上,但没有到达终点。 Elements 是可以循环的常规 ArrayList。
让我们编写 class Stat。 这个 class 的对象将存储每一行的数据。 您还可以为您的业务逻辑编写 getter、setter 和其他方法:

public class Stat {
    private String rank;
    private String level;
    private String ivs;
    private String cp;
    private String att;
    private String def;
    private String sta;
    private String statProduct;
    private String maxStat;

    public Stat(String rank, String level, String ivs, String cp, String att, String def, String sta, String statProduct, String maxStat) {
        this.rank = rank;
        this.level = level;
        this.ivs = ivs;
        this.cp = cp;
        this.att = att;
        this.def = def;
        this.sta = sta;
        this.statProduct = statProduct;
        this.maxStat = maxStat;
    }

    @Override
    public String toString() {
        return "Stat{" +
                "rank='" + rank + '\'' +
                ", level='" + level + '\'' +
                ", ivs='" + ivs + '\'' +
                ", cp='" + cp + '\'' +
                ", att='" + att + '\'' +
                ", def='" + def + '\'' +
                ", sta='" + sta + '\'' +
                ", statProduct='" + statProduct + '\'' +
                ", maxStat='" + maxStat + '\'' +
                '}';
    }
}

它仍然只循环遍历数组。 继续您的代码:

Elements rows = table.select("tr");

            for (int i = 0; i < rows.size(); i++) {
                Element row = rows.get(i);
                Elements td = t.getAllElements();
                Stat stat = new Stat(
                        td.get(1).text(),
                        td.get(2).text(),
                        td.get(3).text(),
                        td.get(4).text(),
                        td.get(5).text(),
                        td.get(6).text(),
                        td.get(7).text(),
                        td.get(8).text(),
                        td.get(9).text()
                );
                
                System.out.println(stat);
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM