【问题标题】:What would the Jsoup selector be for TD elements that have no children and no COLSPAN attribute?对于没有子元素和 COLSPAN 属性的 TD 元素,Jsoup 选择器是什么?
【发布时间】:2012-03-07 02:46:40
【问题描述】:

所以我试图解析一个相对混乱的网页。它包含几个我想提取的键值对。这些对的统一主题是它们是非空的,它们没有子节点,并且它们没有 COLSPAN 属性。这是我尝试过的,这在逻辑上似乎有道理,但没有产生任何结果。

Elements tds = document.select("td:not([colspan]):not(:has(*))");

所以我想要 TD:

  1. 不包含 COLSPAN
  2. 没有孩子

似乎我必须接近,但没有任何运气。有什么想法吗?

【问题讨论】:

  • 你能发布一小段 HTML 示例吗?
  • 您的选择器只适合我。您使用的是哪个 Jsoup 版本?如果是最新的,那么也许您还需要发布 HTML 标记并指出您想要获得的确切内容,以便我们更好地了解您真正需要的内容。

标签: java css-selectors jsoup


【解决方案1】:

我想出了一个答案,它使用循环来删除那些你不想选择的元素。

http://jsoup.org/apidocs/org/jsoup/select/Selector.html

我模拟了一个表格,其中包含您试图避免选择的两种情况。

    String html = 
    "<table>" +
            "<thead><tr><th>Col1</th><th>Col2</th><th>Col3</th></tr></thead>" +
            "<tbody>" +
                "<tr><td>row1col1</td><td>row1col2</td><td>row1col3</td></tr>" +
                "<tr><td colspan='3'>row2fullrow</td></tr>" +
                "<tr><td></td><td>row3col2</td><td><strong>row3col3</strong></td></tr>" +
                "<tr><td>row4col1</td><td colspan='2'><strong>row4col2and3</strong></td></tr>" +
            "</tbody>" +
    "</table>";

    Document doc = Jsoup.parse(html);
    for(Element td : doc.select("td")) {
        if (td.children().size() > 0 || td.hasAttr("colspan")) {
            td.remove();
        }
    }
    System.out.println(doc);

++++++++++++++++++++++++++
更新
+++++++++++++++++++++++++++
我又玩了一点,然后想出了这个(这证明你的选择确实有效)。你的 HTML 一定有其他一些我没有代表的小东西。

    String html = 
    "<table>" +
            "<thead><tr><th>Col1</th><th>Col2</th><th>Col3</th></tr></thead>" +
            "<tbody>" +
                "<tr><td>row1col1</td><td>row1col2</td><td>row1col3</td></tr>" +
                "<tr><td colspan='3'>row2fullrow</td></tr>" +
                "<tr><td></td><td>row3col2</td><td><strong>row3col3</strong></td></tr>" +
                "<tr><td id='x'>row4col1</td><td colspan='2'><strong>row4col2and3</strong></td></tr>" +
            "</tbody>" +
    "</table>";

    Document doc = Jsoup.parse(html);
    System.out.println(doc.select("td:not([colspan]):not(:has(*))"));

【讨论】:

  • 你可能是对的。当然,这不是干净的代码。我会继续玩它的。我确实设法让程序化方法发挥作用,但仍然遇到选择器问题。一旦我有时间再修补一些,就会提供更新。
猜你喜欢
  • 2011-12-20
  • 2016-09-18
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2015-10-31
  • 2013-02-04
  • 2015-02-19
  • 1970-01-01
相关资源
最近更新 更多