如何使用JSOUP通过Java爬取和下载HTML页面中的表格

4
我尝试过这个方法...但是行和列分别打印...我的要求是从HTML页面下载表格。
public class Main {
   public static void main(String[] args) throws IOException {
      String html = "URL";
      // Document doc = Jsoup.connect(html).get();
     Document doc = Jsoup.parse(html);
     System.out.println(doc);
     Elements tableElements = doc.select("table");

     Elements tableHeaderEles = tableElements.select("thead tr th");
    System.out.println("headers");
     for (int i = 0; i < tableHeaderEles.size(); i++) {
        System.out.println(tableHeaderEles.get(i).text());
     }
     System.out.println();

     Elements tableRowElements = tableElements.select(":not(thead) tr");

     for (int i = 0; i < tableRowElements.size(); i++) {
        Element row = tableRowElements.get(i);
        System.out.println("row");
        Elements rowItems = row.select("td");
        for (int j = 0; j < rowItems.size(); j++) {
           System.out.println(rowItems.get(j).text());
        }
     }
   }
}

Thanks in Advance...


1
我不清楚问题出在哪里。你的代码看起来没问题。你有错误吗?如果有,请打印StackTrace。你能发布原始HTML表格并告诉我们你需要什么输出吗? - luksch
抱歉,我无法翻译这段内容。它似乎是一个HTML代码片段,但缺少必要的标签和语法。 - ROOT
当我执行上面的代码时,会得到如上所示的消息... 但我想要的是将HTML页面上的表格下载到某个点扩展文件中。 - ROOT
什么是下载?您想从Java进程中编写包含表格数据的文件吗?如果是这样,请使用Java的文件系统方法或其周围的某个包装器,例如Apache Commons:https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.html。 - luksch
我的需求是将HTML页面中的表格数据存储到某个文件中(.txt / .pdf ...),请帮忙。 - ROOT
所以,您的问题不在于HTML也不在于Jsoup。而是关于如何从Java写入文件。我建议您阅读有关该主题的文章。例如:http://www.mkyong.com/java/how-to-export-data-to-csv-file-java/ - luksch
1个回答

4
使用 luksch在评论中提到的教程,解决方案可能是:
package com.github.davidepastore.stackoverflow34331254;

import java.io.FileWriter;
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * Reply to stackoverflow 34331254 question.
 *
 */
public class App {
    public static void main(String[] args) throws IOException {
        String url = "http://www.htmlcodetutorial.com/tables/_THEAD.html";
        String fileName = "table.csv";
        FileWriter writer = new FileWriter(fileName);
        Document doc = Jsoup.connect(url).get();
        System.out.println(doc);
        Element tableElement = doc.select("table").first();

        Elements tableHeaderEles = tableElement.select("thead tr th");
        System.out.println("headers");
        for (int i = 0; i < tableHeaderEles.size(); i++) {
            System.out.println(tableHeaderEles.get(i).text());
            writer.append(tableHeaderEles.get(i).text());

            if(i != tableHeaderEles.size() -1){             
                writer.append(',');
            }
        }
        writer.append('\n');
        System.out.println();

        Elements tableRowElements = tableElement.select(":not(thead) tr");

        for (int i = 0; i < tableRowElements.size(); i++) {
            Element row = tableRowElements.get(i);
            System.out.println("row");
            Elements rowItems = row.select("td");
            for (int j = 0; j < rowItems.size(); j++) {
                System.out.println(rowItems.get(j).text());
                writer.append(rowItems.get(j).text());

                if(j != rowItems.size() -1){
                    writer.append(',');
                }
            }
            writer.append('\n');
        }

        writer.close();
    }
}

这将创建一个包含第一张表格(包括标题)的 csv 文件。
表格内容如下:
<table cellpadding="6" rules="GROUPS" frame="BOX">
   <thead>
      <tr>
         <th>Weekday</th>
         <th>Date</th>
         <th>Manager</th>
         <th>Qty</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>Mon</td>
         <td>09/11</td>
         <td>Kelsey</td>
         <td>639</td>
      </tr>
      <tr>
         <td>Tue</td>
         <td>09/12</td>
         <td>Lindsey</td>
         <td>596</td>
      </tr>
      <tr>
         <td>Wed</td>
         <td>09/13</td>
         <td>Randy</td>
         <td>1135</td>
      </tr>
      <tr>
         <td>Thu</td>
         <td>09/14</td>
         <td>Susan</td>
         <td>1002</td>
      </tr>
      <tr>
         <td>Fri</td>
         <td>09/15</td>
         <td>Randy</td>
         <td>908</td>
      </tr>
      <tr>
         <td>Sat</td>
         <td>09/16</td>
         <td>Lindsey</td>
         <td>371</td>
      </tr>
      <tr>
         <td>Sun</td>
         <td>09/17</td>
         <td>Susan</td>
         <td>272</td>
      </tr>
   </tbody>
   <tfoot>
      <tr>
         <th align="LEFT" colspan="3">Total</th>
         <th>4923</th>
      </tr>
   </tfoot>
</table>

csv输出将是:

Weekday,Date,Manager,Qty
Mon,09/11,Kelsey,639
Tue,09/12,Lindsey,596
Wed,09/13,Randy,1135
Thu,09/14,Susan,1002
Fri,09/15,Randy,908
Sat,09/16,Lindsey,371
Sun,09/17,Susan,272

更新

你所说的表格是从另一个网址加载的:http://factfinder.census.gov/tablerestful/tableServices/renderProductData?renderForMap=f&renderForChart=f&pid=PEP_2014_PEPANNRES&src=pt&log=t&_ts=468903667318

它包含一个productDataTable属性,其中包含表格内容。


你好Davide Pastore...首先感谢您的快速回复,您发布的答案有效,但在我的情况下,要加载到表中的数据是动态加载的,而在爬取时它不显示数据。 - ROOT
@satish 你的意思是数据是通过Ajax请求加载的吗? - Davide Pastore
你能添加包含表格的链接吗? - Davide Pastore
你好 @Davide Pastore,如果你无法获取表格,请关闭并重新打开链接。谢谢你的提前帮助。 - ROOT
1
你好 @Davide Pastore ... 谢谢兄弟。现在它运行良好。 - ROOT
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接