2014-01-03 3 views
1

Я разбор файла HTML с вложенными неупорядоченными списками, вот пример:Разбора вложенных HTML неупорядоченных списков с Jsoup

<ul> 
    <li class="category_x">xyz abc 
     <ul> 
      <li>foo 123 bar</li> 
      <li>456 bar foo</li> 
     </ul> 
    </li> 
    <li class="category_x">aaa bbb ccc 
     <ul> 
      <li>xxx yyy zzz</li> 
      <li>123 abc 456</li> 
     </ul> 
    </li> 
</ul> 

Я заинтересован в отношениях li > ul > li (думает, что у него в качестве объектов Jsoup типа Element : grandParentNode>parentNode>eNode), но используя метод grandParentNode.text() Я получаю также текст в целом вложенном списке <ul> (в комплекте eNode.text()).

// getting the triplets 
    Elements triplets = doc.select("li > ul > li"); 

    // print the triplet 
    for (Element eNode : triplets) 
    { 
     Element parentNode = eNode.parent(); 
     Element grandParentNode = parentNode.parent(); 

     System.out.println("Current node: " + eNode.text()); 
     System.out.println("Grand parent: " + grandParentNode.text()); 
    } 

Выход:

Current node: foo 123 bar 
Grand parent: xyz abc foo 123 bar 456 bar foo 
Current node: 456 bar foo 
Grand parent: xyz abc foo 123 bar 456 bar foo 
Current node: xxx yyy zzz 
Grand parent: aaa bbb ccc xxx yyy zzz 123 abc 456 
Current node: 123 abc 456 
Grand parent: aaa bbb ccc xxx yyy zzz 123 abc 456 

Я хотел бы, чтобы это было:

Current node: foo 123 bar 
Grand parent: xyz abc 
Current node: 456 bar foo 
Grand parent: xyz abc 
Current node: xxx yyy zzz 
Grand parent: aaa bbb ccc 
Current node: 123 abc 456 
Grand parent: aaa bbb ccc 

Посмотрев на документацию Jsoup кажется мне нужно изменить HTML для того, чтобы получите эти строки, включенные в что-то вроде атрибута value="", но я не могу изменить HTML ... Кроме того, все эти <li class="category_x"> повторяются везде с тем же значением на каждом узле, который не является «li лист» дерева, поэтому они не очень помогают в фильтрации данных.

Я уже пробовал такие вещи, как doc.select("li:lt(1) > ul > li");, но это не работает, проблема структура HTML и как я использую метод text() из Element класса Jsoup. Дело в том, что я понятия не имею, как избежать text().

Любая идея?

Благодаря

ответ

2

Используйте метод ownText() выбрать только текст, принадлежащий непосредственно на элемент, не обращая внимания на текст любых дочерних элементов.

Так измените эту строку:

System.out.println("Grand parent: " + grandParentNode.text()); 

к

System.out.println("Grand parent: " + grandParentNode.ownText()); 

Выход теперь будет показывать:

Current node: foo 123 bar 
Grand parent: xyz abc 
Current node: 456 bar foo 
Grand parent: xyz abc 
Current node: xxx yyy zzz 
Grand parent: aaa bbb ccc 
Current node: 123 abc 456 
Grand parent: aaa bbb ccc 
Смежные вопросы