在 Java 中使用 Jsoup 将 HTML 表解析为 JSON

Posted

技术标签:

【中文标题】在 Java 中使用 Jsoup 将 HTML 表解析为 JSON【英文标题】:Parse HTML table to JSON using Jsoup in Java 【发布时间】:2017-07-15 18:40:57 【问题描述】:

我有一个格式如下的 html 表格:

<table>
    <tbody>
        <tr>
            <td>Book1</td>
            <td>Group1</td>
            <td>Code1</td>
            <td>Lesson1</td>
            <td>Day1</td>
            <td>Day2</td>
            <td>Day3</td>
        </tr>
        <tr>
            <td>Book2</td>
            <td>Group2</td>
            <td>Code2</td>
            <td>Lesson2</td>
            <td>Day1</td>
            <td>Day2</td>
            <td>Day3</td>
        </tr>
    </tbody>
</table>

我想用 Jsoup 解析这个 HTML,并输出一个 JSON 字符串,格式如下:


   "Book1": 
      "Group": "Group1",
      "Code": "Code1",
      "Lesson": "Lesson1",
      "Day1": "Day1",
      "Day2": "Day2",
      "Day3": "Day3"
   ,
   "Book2": 
      "Group": "Group2",
      "Code": "Code2",
      "Lesson": "Lesson2",
      "Day1": "Day1",
      "Day2": "Day2",
      "Day3": "Day3"
   

我试过这段代码:

public String TableToJson(String source) throws JSONException 
    Document doc = Jsoup.parse(source);
    JSONObject jsonObject = new JSONObject();
    JSONArray list = new JSONArray();
    for (Element table : doc.select("table")) 
        for (Element row : table.select("tr")) 
            Elements tds = row.select("td");
            String Name = tds.get(0).text();
            String Group = tds.get(1).text();
            String Code = tds.get(2).text();

            jsonObject.put("Name", Name); 
            jsonObject.put("Group", Group);
            jsonObject.put("Code", Code);
            list.put(jsonObject);
        
    
    return list.toString();

但是它返回了错误的结果:

[
    
        "Name": "Book1",
        "Group": "Group1",
        "Code": "Code1"
    ,
    
        "Name": "Book1",
        "Group": "Group1",
        "Code": "Code1"
    
]

我无法更改表格代码,因为它在另一台服务器上。

如何在 Java 中使用 Jsoup 从输入中获得所需的结果?

【问题讨论】:

你尝试过什么吗?出现错误? @Coder 我编辑问题 你使用的是同一个JSONObject 【参考方案1】:

您的代码的问题是您正在尝试使用相同的jsonObject,并且您还使用了您不需要的JsonArray。您需要一个包含 objects 但不包含 array of objects 的对象

public String TableToJson(String source) throws JSONException    
     Document doc = Jsoup.parse(source);
        JSONObject jsonParentObject = new JSONObject();
        //JSONArray list = new JSONArray();
        for (Element table : doc.select("table")) 
            for (Element row : table.select("tr")) 
                JSONObject jsonObject = new JSONObject();
                Elements tds = row.select("td");
                String Name = tds.get(0).text();
                String Group = tds.get(1).text();
                String Code = tds.get(2).text();
                String Lesson = tds.get(3).text();
                String Day1 = tds.get(4).text();
                String Day2 = tds.get(5).text();
                String Day3= tds.get(6).text();        
                jsonObject.put("Group", Group);
                jsonObject.put("Code", Code);
                jsonObject.put("Lesson", Lesson);
                jsonObject.put("Day1", Day1);
                jsonObject.put("Day2", Day2);
                jsonObject.put("Day3", Day3);
                jsonParentObject.put(Name,jsonObject);
             
        
    return jsonParentObject.toString();

如果您需要澄清,请告诉我!

【讨论】:

以上是关于在 Java 中使用 Jsoup 将 HTML 表解析为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

将带有 jsoup 的 HTML 表解析为 android listview

Java爬虫利器HTML解析工具-Jsoup

在 Java 中使用 JSOUP 库从 HTML 中读取内容

java jsoup怎样爬取特定网页内的数据

如何将用 Jsoup(Java html 解析器)制作的文档转换为字符串

jsoup教程