如何将 HTML <table> 转换为二维数组
Posted
技术标签:
【中文标题】如何将 HTML <table> 转换为二维数组【英文标题】:How to convert HTML <table> to a 2D array 【发布时间】:2012-08-11 15:56:05 【问题描述】:
假设我复制了一个完整的 html 表(当每个 tr
和 td
都有额外的属性时)
成一个字符串。如何获取所有内容(标签之间的内容)并创建一个像原始表格一样组织的二维数组?
例如这个表:
<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('<whateverhtmltabletag>')
可以帮助你?
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("<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> 转换为二维数组的主要内容,如果未能解决你的问题,请参考以下文章