【问题标题】:How to get text between two Elements in DOM object?如何在 DOM 对象中的两个元素之间获取文本?
【发布时间】:2011-11-25 23:23:36
【问题描述】:

我正在使用 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();

但如果我使用,我不确定如何将“on 27/09/2011 -15:17”放入变量中

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

它还包含用户名和网站???

任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: java html dom tags jsoup


    【解决方案1】:

    您始终可以像这样删除 userwebsite 元素(如果您不希望删除操作“损坏”您的文档,您可以克隆您的 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
    

    【讨论】:

      【解决方案2】:

      然后你可以解析你得到的字符串。

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

      然后你可以像这样构造你想要的字符串:

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

      这将提取您需要的字符串。

      【讨论】:

      • 用户名可能包含空格并导致问题
      • 好吧,你可以将用户名和网络放入变量中,然后从给定的字符串中提取其他数据就没有问题了,这样写: contentString.replace("username","");和 contentString.replace("web","");这将从字符串中删除用户名和网络名称,然后您可以修剪字符串以删除前后的空格。
      【解决方案3】:

      选择要抓取的文本之前的元素,然后获取它的下一个兄弟节点(不是元素),它是一个文本节点:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-08
        • 2018-02-07
        • 2023-03-24
        • 2018-12-17
        • 1970-01-01
        • 2020-01-01
        • 2010-09-18
        相关资源
        最近更新 更多