Jsoup выбрать текст после тега со многими тегами - PullRequest
0 голосов
/ 22 октября 2018

Я хочу извлечь текст после каждого текста, используя jsoup .Есть ли способ выбрать его?

Пример кода, подобный приведенному ниже:

<div class="content">
<div name="panel-summary" id="summary">
    <p>
    <strong>A: </strong>*thank you* **I want to retrieve this text**<br>
    <strong>B: </strong>*Bla..bla* *I don't want this text*<br>
    <strong>C: </strong>*what ever text* *I dont want this*                         
        <strong>D: </strong>*anythinh text* *I want this*<br>
        <strong>E: </strong>*Bla..bla* *I don't want this text*t<br>
        <strong>F: </strong>*anythinh text* *I want this*<br>
    </p>

    <p>I want this</p>

, и когда он завершается, создается пример автоматического идентификатора id = 123

1 Ответ

0 голосов
/ 22 октября 2018

Если мы можем предположить, что все элементы <strong>, которые вы хотите найти, всегда будут содержать A: или D: или F:, тогда с помощью strong:matchesOwn(regex) (где регулярное выражение будет представлять A:|D:|F:), мы можем выбрать этиelements.

После обработки strong мы можем перейти ко второму <p> и получить его текстовое содержимое через text().

String html = "<div class=\"content\">\n" +
        "<div name=\"panel-summary\" id=\"summary\">\n" +
        "    <p>\n" +
        "    <strong>A: </strong>*thank you* **I want to retrieve this text**<br>\n" +
        "    <strong>B: </strong>*Bla..bla* *I don't want this text*<br>\n" +
        "    <strong>C: </strong>*what ever text* *I dont want this*                         \n" +
        "        <strong>D: </strong>*anythinh text* *I want this*<br>\n" +
        "        <strong>E: </strong>*Bla..bla* *I don't want this text*t<br>\n" +
        "        <strong>F: </strong>*anythinh text* *I want this*<br>\n" +
        "    </p>\n" +
        "\n" +
        "    <p>I want this</p>";

Document doc = Jsoup.parse(html);
Elements pElements = doc.select("#summary p");
Elements strongElements = pElements.first().select("strong:matchesOwn(A:|D:|F:)");
for (Element strong : strongElements) {
    System.out.println(strong.nextSibling());//get next element, including textual element
}
System.out.println("---");
System.out.println(pElements.get(1).text());//textual content of <p>I want this</p>

Вывод:

*thank you* **I want to retrieve this text**
*anythinh text* *I want this*
*anythinh text* *I want this*
---
I want this

Если вы не хотите полагаться на содержимое <strong>, а просто на его индексы, то выберите все из них, например

Elements allStrElemens = doc.select("#summary p strong");

, и просто выберите нужные вам по их индексам (запомнитеиндексы начинаются с 0) как

System.out.println(allStrElemens.get(0).nextSibling());
System.out.println(allStrElemens.get(3).nextSibling());
System.out.println(allStrElemens.get(5).nextSibling());
...