0

我有一个由 JSoup 解析的 html 文档。在这个表中有几行:

<table>
    <tbody>
        <tr>...</tr>
        <tr>...</tr>
        <tr>...</tr>
        <tr>...</tr>
        <tr>...</tr>
        <tr>...</tr>
    </tbody>
</table>

有些行是一种标题 - 我用 Jsoupselect(...)方法找到这些行。所以我有Elements一个包含所有标题行的对象。假设它看起来像这样:

<table>
    <tbody>
        <tr id="tr1">...</tr> 
        <tr id="tr2">...</tr> // this is header
        <tr id="tr3">...</tr>
        <tr id="tr4">...</tr>
        <tr id="tr5">...</tr> // this is header
        <tr id="tr6">...</tr>
    </tbody>
</table>

id 属性仅用于此示例 - 真实情况下,解析的 html 中没有 id 属性。

我需要的是获取 2 个表(Element包含每个表的 2 个对象),每个表头一个,包含给定表头下方但下一个表头上方的所有行。所以我期望:

<table> // Element 1
    <tbody>
        <tr id="tr3">...</tr>
        <tr id="tr4">...</tr>
    </tbody>
</table>

<table> // Element 2
    <tbody>
        <tr id="tr6">...</tr>
    </tbody>
</table>

any1 可以帮我完成这项任务吗?

4

1 回答 1

1

这是测试 JSoup 处理 dom 能力的一个很好的练习。以下是您需要的片段。该代码几乎是不言自明的(createElement创建一个元素等),但如果您需要任何澄清,请告诉我:

Elements tables = new Elements();
for (Element headerTR : headerRows) {
    Element tbody = doc.createElement("tbody");
    Element firstSiblingTR = headerTR.nextElementSibling();
    if (firstSiblingTR != null) {
        Element secondSiblingTR = firstSiblingTR.nextElementSibling();
        tbody.appendChild(firstSiblingTR);
        if (secondSiblingTR != null) {
            tbody.appendChild(secondSiblingTR);
        }
    }
    Element table = doc.createElement("table");
    table.appendChild(tbody);
    tables.add(table);
}

示例用法:

public static void main(String[] args) {
    Document doc = Jsoup.parse("<html><body>"+
    "<table>" +
    "  <tbody>" +
    "    <tr><td>1</td></tr>" +
    "    <tr class='header'><td>2</td></tr>" + // class added to simulate ur list
    "    <tr><td>3</td></tr>" +
    "    <tr><td>4</td></tr>" +
    "    <tr class='header'><td>5</td></tr>" + // class added to simulate ur list
    "    <tr><td>6</td></tr>" +
    "  </tbody>" +
    "</table>" +
    "</body></html>");

    Elements headerRows = doc.getElementsByClass("header"); // simulating ur list

    Elements tables = new Elements();
    for (Element headerTR : headerRows) {
        Element tbody = doc.createElement("tbody");
        Element firstSiblingTR = headerTR.nextElementSibling();
        if (firstSiblingTR != null) {
            Element secondSiblingTR = firstSiblingTR.nextElementSibling();
            tbody.appendChild(firstSiblingTR);
            if (secondSiblingTR != null) {
                tbody.appendChild(secondSiblingTR);
            }
        }
        Element table = doc.createElement("table");
        table.appendChild(tbody);
        tables.add(table);
    }
    System.out.println(tables); // print <table> list
}

输出:

<table>
    <tbody>
        <tr><td>3</td></tr>
        <tr><td>4</td></tr>
    </tbody>
</table>
<table>
    <tbody>
        <tr><td>6</td></tr>
    </tbody>
</table>
于 2013-06-14T17:55:28.020 回答