2

我必须从一个我无法更改的网站解析一些 HTML。我正在使用 Jsoup。

这是一些html:

<th></th>
<td> <!-- <td> tags on a high level in the hierarchy. -->
  <table>
    <tbody>
       <tr>
         <td></td> <!-- <td> tags on a low level in the hierarchy. -->
         <td></td>
         <td></td>
       </tr>
    </tbody>
  </table>
</td>
<td></td>
<td></td>

我想这样做,elementname.getElemementsByTag("td");但这种方法获取所有<td>标签,但我只想获取<td>层次结构中高层的标签并跳过层次结构中较低级别的标签。有谁知道这是怎么做到的吗?

感谢所有帮助。

4

2 回答 2

3

Jsoup 允许您通过 CSS 选择器获取元素document.selector("CSS SELECTOR")

如果你想要tda 的直接子代,table你可以使用CSS 选择器>,这意味着直接子代。那么,对于您的情况,您应该使用:

#tableID > tbody > tr > td

这将为您td提供#tableID table. 需要注意的一些事项:

  • 必须包括> tbody > tr在中间。即使您的原始 HTML 标记没有它们,Jsoup 也会在解析 HTML 时创建它们。
  • 你不需要在第一部分有一个 ID。你可以拥有任何东西。例如,所有具有 class :td的 s 的所有第一级 s 。table.prettytable.pretty > tbody > tr > td

在 Jsoup 中:

  • Elements tds = document.select("#tableID > tbody > tr > td");
  • 或者,如果您想先选择表(或之前已选择):
    • Element myTable = document.select("#tableID");
    • Elements tds = myTable.select(" > tbody > tr > td");

最后但并非最不重要的一点是,TD从您的示例中获取 s 的示例代码:

import org.jsoup.Jsoup;
import org.jsoup.nodes.*;
import org.jsoup.select.*;

public class JsoupHtmlDirectChildren {
    public static void main(String[] args) {
        String html = "" +
                "<html>                                                                  " +
                "  <body>                                                                " +
                "    <span>HELLO!</span>                                                 " +
                "    <table id=\"myTable\">                                              " +
                "      <tbody>                                                           " +
                "        <tr>                                                            " +
                "          <th>header</th>                                               " +
                "          <!-- <td> tags on a high level in the hierarchy. -->          " +
                "          <td>high level1                                               " +
                "            <table>                                                     " +
                "              <tbody>                                                   " +
                "                <tr>                                                    " +
                "                  <!-- <td> tags on a low level in the hierarchy. -->   " +
                "                  <td>low level1</td>                                   " +
                "                  <td>low level2</td>                                   " +
                "                  <td>low level3</td>                                   " +
                "                </tr>                                                   " +
                "              </tbody>                                                  " +
                "            </table>                                                    " +
                "          </td>                                                         " +
                "          <td>high level2</td>                                          " +
                "          <td>high level3</td>                                          " +
                "        </tr>                                                           " +
                "      </tbody>                                                          " +
                "    </table>                                                            " +
                "  </body>                                                               " +
                "</html>                                                                 ";
        Document doc = Jsoup.parse(html);
        // all first level children TD of the #myTable table
        Elements highLevelTDs = doc.select("#myTable > tbody > tr > td");
        System.out.println("QUANTITY FOUND: "+highLevelTDs.size());
        for (Element td : highLevelTDs) {
            System.out.println("\n\n###HIGH LEVEL TD: "+td);
        }
    }
}

输出:

QUANTITY FOUND: 3

###HIGH LEVEL TD: <td>high level1 
 <table> 
  <tbody> 
   <tr> 
    <!-- <td> tags on a low level in the hierarchy. --> 
    <td>low level1</td> 
    <td>low level2</td> 
    <td>low level3</td> 
   </tr> 
  </tbody> 
 </table> </td>

###HIGH LEVEL TD: <td>high level2</td>

###HIGH LEVEL TD: <td>high level3</td>
于 2013-06-30T07:15:44.500 回答
0

我希望您正在查看的站点具有详细的 HTML 标记,而不是您在此处向我们展示的那个。

如果您的标签具有类或 ID 或其他属性等描述符,它们可用于过滤Elements您感兴趣的相应内容。

例如。要获取<td>具有类属性“high”的所有元素,您可以执行类似的操作。

Elemenets highTDElements = rootElementName.select("td.high");

有关选择器语法的更多详细信息可在官方网站上找到,但这仅在有属性/ID/类等描述符时才有用。

否则你会受到 DOM 遍历的限制,你应该真正知道元素的确切位置。

于 2013-06-30T06:47:42.623 回答