JSOUP使用节点获取HTML标记之外的特定文本

时间:2014-03-11 07:02:02

标签: android html parsing jsoup nodes

所以,我一直在使用jSoup来解析网站上的一些metaData,效果很好。问题是我需要的一些重要元数据不在任何标签内,我不知道如何获得它。

以下是我需要从我的网址获取的数据示例:

<div class="newclass ">
        <div>
            <p>     
                    <strong>Arist:</strong>&nbsp;Picasso Biggie <em>|</em>
                    <strong>Released:</strong>&nbsp;3 years ago <em>|</em>
                    <strong>Album:</strong>&nbsp;Picasso Biggie: The Big OneUp <em>|</em>                       
                    <strong>Producer:</strong>&nbsp;Various <em>|</em>                      
                    <strong>Featuring:</strong>&nbsp;Mount Kimbie <em>|</em>                                        
            </p>
        </div>
</div>

我在html中寻找的是艺术家“Picasso Biggie”,它是“3年前”发行的那一年,以及专辑“Picasso Biggie:The Big OneUp”等...... 我已经研究过使用带有jSoup的节点,但我只能找到一些例子,并且无法弄清楚如何让jSoup去做我正在寻找的东西。

这是我尝试过的代码,它什么都不返回:

Document doc = Jsoup.connect(URL).get;
Elements dakss1 = doc.select(".newclass ");
for(Element dakss : rayz1) { 
     TextNode quill = (TextNode) rayz1.nextSibling().childNode(0);
     System.out.println("" + quill);
}

更新: Shaowei Ling的答案非常适合在标签之外获取所有文字,但我想知道是否有办法只指定特定节点,所以我可以只得到具体的话。例如,而不是

    Picasso Biggie
    3 years ago
    Picasso Biggie: The Big OneUp
    Various
    Mount Kimbie

我只得到:

3 years ago

如果我需要的只是专辑发行的那一年?

更新#2: 好的,为了解决我的第二个问题,即我使用与上面相同的HTML结构解析多个项目,我只是继续在jSoup的选择器查询中包含我想要的特定元素。所以,例如,如果我想获得Picasso Biggies专辑的所有发行日期。这是我使用的代码:

    Document doc = Jsoup.connect(URL).get;
    Elements dakss1 = doc.select(".newclass p strong:contains(Released) ");
    for(Element dakss : dakss1) { 
         Node nodeWithReleaseDates =(Node) dakss.nextSibling();;
         System.out.println("" + nodeWithReleaseDates);
    }

这继续并且返回了毕加索Biggie各种专辑所需的所有发行日期,如下所示:

3 years ago
2 years ago 
7 months ago
1 month ago

1 个答案:

答案 0 :(得分:3)

在您的问题中,有一个未定义的变量rayz1

示例代码可以帮助您。我已经运行它,它有效。

    String html = 
            "<div class=\"newclass \">\n"
            + "        <div>\n"
            + "            <p>     \n"
            + "                    <strong>Arist:</strong>&nbsp;Picasso Biggie <em>|</em>\n"
            + "                    <strong>Released:</strong>&nbsp;3 years ago <em>|</em>\n"
            + "                    <strong>Album:</strong>&nbsp;Picasso Biggie: The Big OneUp <em>|</em>                       \n"
            + "                    <strong>Producer:</strong>&nbsp;Various <em>|</em>                      \n"
            + "                    <strong>Featuring:</strong>&nbsp;Mount Kimbie <em>|</em>                                        \n"
            + "            </p>\n"
            + "        </div>\n"
            + "</div>";
    Document doc = Jsoup.parse(html);
    Elements dakss1 = doc.select("div p strong");
    for (Node dakss : dakss1) {
        System.out.println(dakss.nextSibling().toString().replace("&nbsp;", "").trim());
    }

结果将是:

    Picasso Biggie
    3 years ago
    Picasso Biggie: The Big OneUp
    Various
    Mount Kimbie