2012-02-15 4 views
2

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

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

Так что я хочу TDs, что:

  1. Не содержат Colspan
  2. Не есть дети

Кажется, что я должен быть рядом, но только не имея каких-либо удачи , Есть предположения?

+1

Не могли бы вы разместить небольшой образец HTML? –

+0

Ваш селектор работает только для меня. Какую версию Jsoup вы используете? Если последнее, то, возможно, вам нужно разместить разметку HTML и указать, что именно вы хотели бы получить, чтобы мы лучше понимали, что вам действительно нужно. – BalusC

ответ

2

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

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); 

+++++++++++++++++++++++
UPDATE
+++++++++++++++ ++++++++
Я немного поиграл с ним и придумал это (что доказывает, что ваш выбор работает). Ваш 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(*))")); 
+0

Возможно, вы правы. Это не что иное, как чистый код. Я буду продолжать играть с ним. Мне удалось получить программный подход к работе, но все еще возникают проблемы с селекторами. Дает обновление, как только у меня будет время поработать еще. – meesterguyperson