代码之家  ›  专栏  ›  技术社区  ›  FireHawk2300

多个HTML表行上的Java循环

  •  0
  • FireHawk2300  · 技术社区  · 8 年前

    请注意,我不是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": "● ●"
        }
    ]
    

    2 回复  |  直到 8 年前
        1
  •  1
  •   Vinujan.S    8 年前
    Element table = doc.select("tbody").first();
    

    将“tbody”替换为“table”

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

    如上所述的更改,您错过了获取第jth tr元素和提取细节的机会。

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

    JSONObject jsonObject = new JSONObject();
    

        2
  •  1
  •   Nelson Yeung    8 年前

    您在这里反复使用同一行:

    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");