2016-04-23 2 views
0

Вот некоторые сырые HTML (взяты из большого файла):Jsoup выбрать элемент на глубине (уровень DOM от родителей)

<h1 class="contentHeader">This is the header</h1> 

Используя traverse метод JSoup, я уйду через DOM и расположен этот элемент, наряду с его атрибутами, а именно:

doc.traverse(new NodeVisitor() { 

      @Override 
      public void head(Node node, int depth) { 
        System.out.println(node); 
        System.out.println("Node depth: " + depth); 
        Attributes attrList = node.attributes(); 
        for (Attribute attr: attrList) { 
         System.out.println(attr); 
        } 
.... 
} 

Это дает:

<h1 class="contentHeader">This is the header</h1> 
Node depth: 8 
class="contentHeader" 

Что я сейчас пытаюсь сделать, так это написать однострочную реализацию для поиска этого элемента. Я читал через JSoup Cookbook, и кажется, что с помощью селектора eq нужно указать глубину, но мне не повезло. Самое лучшее, что я могу придумать, это следующее:

System.out.println(doc.select("h1.contentHeader:eq(8)")); 

Но это не выводит данные. Я либо пропускаю что-то важное, не понимая API, либо просто ошибаюсь.

Любой вход или совет были бы весьма признательны.

ответ

1

eq - псевдо-класс/селектор CSS, и он не используется для выбора по глубине. Вот правильное объяснение о what eq does:

Индекс связанных селекторы (:eq(), :lt(), :gt(), :even, :odd) отфильтровать набор элементов, которые соответствовали выражения, которые предшествуют им. Они сужают набор, основанный на порядке элементов в этом согласованном наборе. Например, если элементы сначала выбираются с помощью селектора классов (.myclass) и возвращаются четыре элемента, этим элементам присваиваются индексы 0 до 3 для целей этих селекторов.

Обратите внимание, что поскольку JavaScript-массивы используют 0-based indexing, эти селекторы отражают этот факт. Вот почему $(".myclass:eq(1)") выбирает второй элемент в документе с классом myclass, а не первым. Напротив, :nth-child(n) использует 1-индексирование для соответствия спецификации CSS.

Таким образом, eq не касается глубины.

Но, если ваш HTML есть атрибут class, почему бы не использовать его:

System.out.println(doc.select("h1.contentHeader")); 

Вы также можете написать чрезвычайно descendant selector для этого узла (это просто пример, так как я не знаю вашего HTML-структура):

System.out.println(doc.select("body div .someClass div div h1.contentHeader")); 
+0

Благодарим за информацию! В этом случае элемент имеет класс, но большая часть документа написана без каких-либо классов или идентификаторов, поэтому я надеялся что-то сделать с позицией элемента в общей структуре. Я посмотрю и подумаю. Благодаря! – Tony

Смежные вопросы