java - 提取表标题,然后添加到表中保存的所有记录的数组列表

标签 java html for-loop jsoup

我目前正在从以下网站抓取分数:http://www.bbc.co.uk/sport/rugby-union/results并将它们存储在四个数组列表中。

这是我获取表格内容的代码:

for (Element table : doc.select("table:first-of-type")) { 
                         for (Element row : table.select("tr")) {
                              Elements td = row.select("td"); 
                              List1.add(td.get(0).text());
                              List2.add(td.get(1).text());
                              List3.add(td.get(2).text());
                              List4.add(td.get(3).text());
                         }
                    }

我会得到以下输出:

List 1: [Worcester, Sale, Ulster]
List 2: [22 - 23, 24 - 19, 10 - 7]
List 3: [Leicester, Gloucester, Ospreys]
List 4: [Full Time, Full Time, Full Time]

但是由于分数都是与不同锦标赛的分数一起显示的。我现在想要解析 <p class="table-description">Aviva Premiership</p> 中包含的锦标赛名称- 例如,Aviva Premiership 将有两个结果,而 Rabodirect Pro12 将有一个结果。因此,对于前两个结果,Aviva Premiership 将被添加到数组列表中,然后对于下一个结果,将添加 Rabodirect Pro12。

这是我当前的尝试:

 Document doc = Jsoup
                  .connect("http://www.bbc.co.uk/sport/rugby-union/results") 
                  .timeout(5000)
                  .get();

      for (Element pTag : doc.select("p[class=table-description]")) {
           List1.add(pTag.text());

           for (Element row : doc.select("tr")) {
                     Elements td = row.select("td"); 

                     List2.add(td.get(0).text());
                     List3.add(td.get(1).text());
                     List4.add(td.get(2).text());
                     List5.add(td.get(3).text());
                }

但这只会解析每个结果,我似乎无法弄清楚如何在进入下一个锦标赛名称之前将其添加到每个结果中。

从我当前的示例来看,所需的输出看起来是这样的:

List 5: [Aviva Premiership, Aviva Premiership, RaboDirect Pro12]

最佳答案

我认为您应该使用 div.table-table-stats 元素作为起点并迭代它们。在循环内,您可以使用表格作为起点来获取联赛名称,然后获取 tr 元素。为了在正确的列表索引处重复每场比赛的联赛信息,您需要将 list1.add(dataTable.select("p.table-description").text()); 在内循环内部。

如果您想包含比赛日期,您可以使用类似的方法向上一级。

Document doc = Jsoup
            .connect("http://www.bbc.co.uk/sport/rugby-union/results") 
            .timeout(5000)
            .get();

List<String> list1 = new ArrayList<String>(); //league name
List<String> list2 = new ArrayList<String>(); 
List<String> list3 = new ArrayList<String>();
List<String> list4 = new ArrayList<String>();
List<String> list5 = new ArrayList<String>();

for (Element dataTable : doc.select("div.table-table-stats")) {

    for (Element row : dataTable.select("tr")) {
           Elements td = row.select("td"); 
           list1.add(dataTable.select("p.table-description").text());
           list2.add(td.get(0).text());
           list3.add(td.get(1).text());
           list4.add(td.get(2).text());
           list5.add(td.get(3).text());
    }
}
System.out.println(list1);
System.out.println(list2);
System.out.println(list3);
System.out.println(list4);
System.out.println(list5);

PS:您应该考虑用游戏数据填充辅助对象。使用多个列表似乎是一个糟糕的设计选择。

关于java - 提取表标题,然后添加到表中保存的所有记录的数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21646246/

相关文章:

python - 从网站中提取表格

javascript - anchor 标签跳转以避免固定标题

java - 填充特定范围内的数组

java - 编写 for 循环/while 循环?

java - Android 裁剪并减小视频大小

java 8,List<Employee> 映射部门和地址列表

java - 通过 html 表和 Swing 拖放?

javascript - 将 div 放置在另一个 div 下方

c++ - 如何在 C++ 中并排显示两个函数?

java - 传递泛型作为方法的参数