Помощь DOM - jsoup nextSibling - PullRequest
       3

Помощь DOM - jsoup nextSibling

2 голосов
/ 01 марта 2012

То, что я пытаюсь сделать, кажется мне таким простым, но я борюсь гораздо больше, чем следовало бы. У меня есть документ, который содержит следующее:

<h2>First Heading</h2>
<table>
    <div class="title">First Subheading One</div>
    <div class="title">First Subheading Two</div>
    <div class="title">First Subheading Three</div>
</table>

<h2>Second Heading</h2>
<table>
    <div class="title">Second Subheading One</div>
    <div class="title">Second Subheading Two</div>
    <div class="title">Second Subheading Three</div>
</table>

<h2>Third Heading</h2>
<table>
    <div class="title">Third Subheading One</div>
    <div class="title">Third Subheading Two</div>
    <div class="title">Third Subheading Three</div>
</table>

Использование doc.select ("h2") дает мне все заголовки, как и ожидалось. Использование doc.select ("div.title") дает мне все подзаголовки, также, как и ожидалось. То, что я пытаюсь сделать, это перебирать возвращенные элементы h2 и внутри них, затем перебирать возвращенные элементы div.title - я пробовал много вещей, и я совсем не новичок в кодировании (новичок в jsoup , однако) но я просто не могу обернуться, как это сделать.

Headings = httpDoc.select("h3");
for(Element Headings : heading) {
    // something with heading.nextSibling here
}

Должен ли я что-то сделать (например, nextSibling), которое даст мне узел? И оттуда я могу сделать еще один выбор ("div.title") и перебрать их, чтобы получить подзаголовки?

Или я поступаю совершенно неправильно? Извиняюсь, если это кажется глупым - чувствую себя немного глупо, поскольку я кодирую больше лет, чем я готов признать, но никогда не приходилось иметь дело с DOM (всегда был парнем из Win32).

1 Ответ

4 голосов
/ 01 марта 2012

Мое понимание !!

Из вашего вопроса я понял, что вы пытаетесь получить тег h2, а затем для каждого heading <h2> вы пытаетесь получить соответствующий div.title внутри таблицы.

Ваши ошибки

  1. В приведенном фрагменте кода вы пытаетесь получить h3 вместо h2, который вы не указали в вашем коде HTML.
  2. Во-вторых, HTML-фрагмент содержит ошибки , поскольку согласно стандартам W3 <table> должен иметь <tr> & <td> (я думаю, <td> необязательно, пожалуйста, проверьте W3 страница). Поэтому, когда вы разбираете фрагмент HTML, jSoup просто prunes/removes плохо сформированный <table>

Ожидаемый результат в соответствии с моим пониманием вашей проблемы !!

The header is: First Heading
The div content is: First Subheading One
The div content is: First Subheading Two
The div content is: First Subheading Three
========== +_+ ===========
The header is: Second Heading
The div content is: Second Subheading One
The div content is: Second Subheading Two
The div content is: Second Subheading Three
========== +_+ ===========
The header is: Third Heading
The div content is: Third Subheading One
The div content is: Third Subheading Two
The div content is: Third Subheading Three
========== +_+ ===========

Код для вышеприведенного вывода !!

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JSoupTest 
{
    public static void main(String[] args) 
    {
        String s = "<h2>First Heading</h2>";
        s += "<table><tr><td>";
        s += "<div class='title'>First Subheading One</div>";
        s += "<div class='title'>First Subheading Two</div>";
        s += "<div class='title'>First Subheading Three</div>";
        s += "</table>";

        s += "<h2>Second Heading</h2>";
        s += "<table><tr><td>";
        s += "<div class='title'>Second Subheading One</div>";
        s += "<div class='title'>Second Subheading Two</div>";
        s += "<div class='title'>Second Subheading Three</div>";
        s += "</td></tr></table>";

        s += "<h2>Third Heading</h2>";
        s += "<table><tr><td>";
        s += "<div class='title'>Third Subheading One</div>";
        s += "<div class='title'>Third Subheading Two</div>";
        s += "<div class='title'>Third Subheading Three</div>";
        s += "</td></tr></table>";

        Document doc = Jsoup.parse(s);

        Elements h_2 = doc.select("h2");
        for(int i=0; i<h_2.size(); i++)
        {
            Element e = h_2.get(i);
            System.out.println("The header is: " + e.ownText());

            Element nextSib = e.nextElementSibling();

            Elements divs = nextSib.select("div.title");            
            for(int j=0; j<divs.size(); j++)
            {
                Element d = divs.get(j);
                System.out.println("The div content is: " + d.ownText());
            }

            System.out.println("========== +_+ ===========");
        }
    }
}
...