如何将 HTML <table> 转换为二维数组

Posted

技术标签:

【中文标题】如何将 HTML <table> 转换为二维数组【英文标题】:How to convert HTML <table> to a 2D array 【发布时间】:2012-08-11 15:56:05 【问题描述】:

假设我复制了一个完整的 html 表(当每个 trtd 都有额外的属性时) 成一个字符串。如何获取所有内容(标签之间的内容)并创建一个像原始表格一样组织的二维数组?

例如这个表:

<table border="1">
    <tr align= "center">
        <td align="char">TD1</td>
        <td>td1</td>
        <td align="char">TD1</td>
        <td>td1</td>
    </tr>
    <tr>
        <td>TD2</td>
        <td>tD2</td>
        <td class="bold>Td2</td>
        <td>td2</td>
    </tr>
</table>

我想要这个数组:

PS:我知道我可以使用正则表达式,但它会非常复杂。我想要一个像 JSoup 这样的工具,它可以自动完成所有工作而无需编写太多代码

【问题讨论】:

如果 HTML 有效,您可以使用 SAX XML 解析器或 HTMLCleaner htmlcleaner.sourceforge.net。还有许多其他有助于解析 html 的库。只需检查此列表:java-source.net/open-source/html-parsers 您实际上是在询问将您的表字符串解析为数据数组的算法? 我刚刚补充说,我想要一个像 JSoup 这样的简单工具,它可以自动完成工作而无需编写和分析大量代码 【参考方案1】:

出于我自己的需要,我找到了一种 javascript 自动将表格转换为二维数组的方法。 考虑以下代码:

document.querySelector("#table").children[0].children[r].children[c].innerText

在上面, r = 行索引和 c = 列索引。 可以像使用行索引和列索引一样自动访问数据。

这是另一种方式,类似于 2D 数组访问,但使用 CSS 选择器:

document.querySelector("tr:nth-child(5) td:nth-child(4)")

在第 5 行中找到第 4 列

【讨论】:

【参考方案2】:

到目前为止,它不是最好的,但我希望它会有所帮助......简单的字符串

public void read_data() 
    try 
        file = new File("_result.xml");
        FileReader fileReader = new FileReader(file);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line = "";
        String output = "";
        int a = 0, b = 0;
        boolean _write = false;

        while ((line = bufferedReader.readLine()) != null) 
            if(line.trim().startsWith("<td"))  _write = true;  else  _write = false; 

            if(_write) 
                a = line.indexOf('>')+1;
                b = line.lastIndexOf('<');
                output += line.substring(a,b) + "|";
            

            if(line.trim().equals("</tr>")) 
                System.out.println(output);
                output = "";
            

        
        fileReader.close();
     catch (IOException e) 
        e.printStackTrace();
    

【讨论】:

【参考方案3】:

没关系,我在网上看到了这段代码:HtmlTableParser

其实我现在好像还有一个问题,但是和这个问题不完全相关,所以我再开一个。

【讨论】:

【参考方案4】:

这就是使用 JSoup (srsly, don't use regexp for HTML) 的方式。

Document doc = Jsoup.parse(html);
Elements tables = doc.select("table");
for (Element table : tables) 
    Elements trs = table.select("tr");
    String[][] trtd = new String[trs.size()][];
    for (int i = 0; i < trs.size(); i++) 
        Elements tds = trs.get(i).select("td");
        trtd[i] = new String[tds.size()];
        for (int j = 0; j < tds.size(); j++) 
            trtd[i][j] = tds.get(j).text(); 
        
    
    // trtd now contains the desired array for this table

另外,class 属性值在您的示例中未正确关闭:

<td class="bold>Td2</td>

应该是

<td class="bold">Td2</td>

【讨论】:

如果我们在 HTML 表格中有 colspan 和 rowspan 属性?【参考方案5】:

也许String.split('&lt;whateverhtmltabletag&gt;')可以帮助你?

StringTokenizer 类也很有用。示例:

String data = "one<br>two<br>three";  
StringTokenizer tokens = new StringTokenizer(data, "<br>");  
while (tokens.hasMoreElements())   
   System.out.println(tokens.nextElement());  // prints one, then two, then three

另外,使用indexOf("&lt;tag"),此处示例:http://forums.devshed.com/java-help-9/parse-html-table-into-2d-arrays-680614.html

您还可以使用 HTML 解析器(如 jsoup),然后将表中的内容复制到数组中。这是 javascript 中的示例:JavaScript to parse HTML table of numbers into an array

【讨论】:

以上是关于如何将 HTML <table> 转换为二维数组的主要内容,如果未能解决你的问题,请参考以下文章

将 HTML 表转换为列数组 PHP

如何将 HTML 转换为字符串 android 并打印该字符串

将 HTML 表格转换为文本

html中的table标签中如何将几个<td>合在一起的

将表格 HTML 转换为 JSON

HTML Table表格里如何实现文字超长不折行?