【问题标题】:Java loop on multiple HTML table rows多个 HTML 表行上的 Java 循环
【发布时间】:2017-08-20 16:45:37
【问题描述】:

请注意,我不是 Java 专家,但如果可能的话,我将不胜感激任何帮助和指导。

我有一段 Java 代码可以读取文件的内容并使用 JSOUP 将其解析为 html。然后我需要将表格转换为 JSON。第一行转换成功,但以下行均未转换。

我确信我忽略了一些简单的东西,因此不胜感激任何指导/帮助。

下面是我的程序:

package html_to_json_parser;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class HTML_to_JSON_parser {


public static void main(String[] args) throws IOException {

    InputStream is = new FileInputStream("skills_table.html"); 
    BufferedReader buf = new BufferedReader(new InputStreamReader(is)); 
    String line = buf.readLine(); 
    StringBuilder sb = new StringBuilder(); 

    while(line != null){
        sb.append(line).append("\n");
        line = buf.readLine(); 
    }

    String htmlFile = sb.toString(); 

    Document doc = Jsoup.parse(htmlFile);
    JSONObject jsonObject = new JSONObject();
    JSONObject jsonParentObject = new JSONObject();
    Element table = doc.select("table").first();
    Elements row = table.getElementsByTag("tr");        

        for (int j = 0, k = row.size(); j < k; j++) {

            Elements cols = row.select("td");
            String skill = cols.get(0).text();
            String beginner = cols.get(1).text();
            String intermediate = cols.get(2).text();
            String advanced = cols.get(3).text();
            jsonObject.put("Beginner", beginner);
            jsonObject.put("Intermediate", intermediate);
            jsonObject.put("Advanced", advanced);
            jsonParentObject.put(skill,jsonObject);
         }

    System.out.println(jsonParentObject.toString());

    }

}

需要转成JSON的HTML表格:

<table>
  <thead>
    <tr>
      <th>Skill</th>
      <th>Beginner</th>
      <th>Intermediate</th>
      <th>Advanced</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Reading</td>
      <td>✔</td>
      <td>✔</td>
      <td>✔</td>
    </tr>
    <tr>
      <td>Speaking</td>
      <td>◯</td>
      <td>✔</td>
      <td>✔</td>
    </tr>
    <tr>
      <td>Writing</td>
      <td>◯</td>
      <td>◯</td>
      <td>✔</td>
    </tr>
    <tr>
      <td>Interacting</td>
      <td>●</td>
      <td>●</td>
      <td>● ●</td>
    </tr>
  </tbody>
</table>

需要 JSON 输出:

[
    {
        "skill": "reading",
        "beginner": "✔",
        "intermediate": "✔",
        "advanced": "✔"
    },
    {
        "skill": "writing",
        "beginner": "◯",
        "intermediate": "✔",
        "advanced": "✔"
    },
    {
        "skill": "speaking",
        "beginner": "◯",
        "intermediate": "◯",
        "advanced": "✔"
    },
    {
        "skill": "interacting",
        "beginner": "●",
        "intermediate": "●",
        "advanced": "● ●"
    }
]

非常感谢您的指导和帮助。

【问题讨论】:

  • 这会返回什么row.size()
  • 嗨@SagarRohankar,它返回5,对于五行。

标签: java html json jsoup


【解决方案1】:
Element table = doc.select("tbody").first();

替换“tbody”而不是“table”

还有

Elements cols = row.eq (j).select("td");

像上面一样改变,这里你错过了获取第 j 个 tr 元素并提取细节。

顺便说一句,您也可以使用 get () 而不是 eq () 也可以使用

JSONObject jsonObject = new JSONObject();

Ew.. 大错特错。你应该把上面的初始化放在 for 循环中。因为对于每个 for 循环,它只是更新相同对象的参数,因此它会导致最后更新的细节。

【讨论】:

  • 嗨@Vinujan。 S,谢谢,试过了。仍然只转换第一行:“Reading”。
  • 谢谢,它现在循环遍历每一行,但仅将最后一行的列 ("td") 应用到其他每一行。
  • 我没明白。你能把示例输出吗
  • 输出看起来像: [ { "skill": "reading", "beginner": "●", "intermediate": "●", "advanced": "●●" }, { "技能”:“写作”,“初学者”:“●”,“中级”:“●”,“高级”:“●●”},{“技能”:“口语”,“初学者”:“●”, “中级”:“●”,“高级”:“●●”},{“技能”:“互动”,“初学者”:“●”,“中级”:“●”,“高级”:“●● " } ]
  • 已添加说明。很高兴与您一起解决这个问题。
【解决方案2】:

您在这里一遍又一遍地使用同一行:

Elements row = table.getElementsByTag("tr");        

for (int j = 0, k = row.size(); j < k; j++) {
    Elements cols = row.select("td");

您需要在每个循环中获取正确的行:

Elements cols = row.get(j).select("td");

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 2018-01-05
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多