Как получить текст между двумя элементами в объекте DOM? - PullRequest
2 голосов
/ 27 сентября 2011

Я использую JSoup для анализа этого HTML-контента:

<div class="submitted">
    <strong><a title="View user profile." href="/user/1">user1</a></strong> 
    on 27/09/2011 - 15:17 
    <span class="via"><a href="/goto/002">www.google.com</a></span>
</div> 

Что выглядит следующим образом в веб-браузере:

user1 on 27/09/2011 - 15:17 www.google.com

Имя пользователя и веб-сайт можно разделить на переменные, используя это:

String user    = content.getElementsByClass("submitted").first().getElementsByTag("strong").first().text(); 
String website = content.getElementsByClass("submitted").first().getElementsByClass("via").first().text();

Но я не уверен, как получить «27.09.2011 -15: 17» в переменную, если я использую

String date = content.getElementsByClass("submitted").first().text();

Он также содержит имя пользователя и веб-сайт ???

Любая помощь будет оценена. Спасибо заранее.

Ответы [ 3 ]

2 голосов
/ 27 сентября 2011

Вы всегда можете удалить user и website элементы, подобные этим (вы можете клонировать свой элемент submitted, если не хотите, чтобы действия удаления "повредили" ваш документ):

public static void main(String[] args) throws Exception {

    Document content = Jsoup.parse(
      "<div class=\"submitted\">" +
      "  <strong><a title=\"View user profile.\" href=\"/user/1\">user1</a></strong>" +
      "  on 27/09/2011 - 15:17 " + 
      "  <span class=\"via\"><a href=\"/goto/002\">www.google.com</a></span>" +
      "</div> ");

    // create a clone of the element so we do not destroy the original
    Element submitted = content.getElementsByClass("submitted").first().clone();

    // remove the elements that you do not need 
    submitted.getElementsByTag("strong").remove();
    submitted.getElementsByClass("via").remove();

    // print the result (demo)
    System.out.println(submitted.text());
}

Выходы:

on 27/09/2011 - 15:17
0 голосов
/ 08 июля 2014

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

Document doc = Jsoup.parse("<div class=\"submitted\">" +
  "  <strong><a title=\"View user profile.\" href=\"/user/1\">user1</a></strong>" +
  "  on 27/09/2011 - 15:17 " +
  "  <span class=\"via\"><a href=\"/goto/002\">www.google.com</a></span>" +
  "</div> ");
String str = doc.select("strong").first().nextSibling().toString().trim();
System.out.println(str);

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

Document doc = Jsoup.parse(
            "<div class=\"submitted\">" +
  "  <strong><a title=\"View user profile.\" href=\"/user/1\">user1</a></strong>" +
  "  on 27/09/2011 - 15:17 " +
  "  <span class=\"via\"><a href=\"/goto/002\">www.google.com</a></span>" +
  "</div> ");
String str = doc.select("div").first().textNodes().get(1).text().trim();
System.out.println(str);
0 голосов
/ 27 сентября 2011

Затем вы можете разобрать полученную строку.

String str[] = contentString.split(" ");

Затем вы можете построить желаемую строку следующим образом:

String str = str[1] + " " + str[2] + " - " + str[4];

Это извлечет необходимую вам строку.

...