Каким будет селектор Jsoup для элементов TD, которые не имеют дочерних элементов и атрибута COLSPAN? - PullRequest
2 голосов
/ 15 февраля 2012

Итак, я пытаюсь разобрать веб-страницу, которая является относительно грязной.Он содержит несколько пар ключ-значение, которые я хотел бы извлечь.Объединяющей темой этих пар является то, что они не пустые, у них нет дочерних элементов и у них нет атрибута COLSPAN.Вот что я попробовал, что, кажется, логично, но не дает никаких результатов.

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

Поэтому я хочу, чтобы TD, которые:

  1. Не содержали COLSPAN
  2. Нет детей

Кажется, я должен быть рядом, но просто не везет.Есть мысли?

1 Ответ

2 голосов
/ 17 февраля 2012

Я придумал ответ, который использует цикл для удаления тех элементов, которые вы не хотите выбирать.

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(*))"));
...