【问题标题】:How to JSOUP parse html following the nextSibling?如何在 nextSibling 之后 JSOUP 解析 html?
【发布时间】:2016-03-25 15:55:58
【问题描述】:

有 HTML:

   <table width="100%" cellpadding="0" cellspacing="0" border="0">
    <tr>
    <td width="27%" align="left" valign="top">
    <span class="param">Text0</span> 23<br />
    <span class="param">Text1</span> 173<br />
    <span class="param">Text2</span> 54<br />
    <span class="param">Text3</span> 2<br /><br />
    </td>
    <td width="27%" align="left" valign="top">
    <span class="param">Text4</span><br />
    one <br />
    two <br />
    three <br />
    </td>
    <td width="46%" align="left" valign="top">
    <span class="param">Text5</span><br /> 
    one -<br />
    two -<br />
    three -<br />
    </td>
    </tr>
    </table>

我可以获取值Text0-3解析代码更改get(0)-get(3),但无法获取Text4和Text5:

Document doc = Jsoup.connect("text.html").get();

Element param = doc.select("span[class=param]").get(0);

Node node = param.nextSibling();

System.out.println(node.toString());

如何获取Text4和Text5的值? get(4) 或 get(5),现在返回 br,但我需要得到“一、二、三”

现在我使用这个代码:

Document doc = Jsoup.connect("text.hml").get();

        Elements params = doc.select("span[class=param]");
        int i;
        for (i=0; i<6; i++) {
        Element param = params.get(i);

        Node node = param.nextSibling();

        System.out.println(node.toString());

        }

这个印刷品:

 23
 173
 54
 2
<br>
<br>

我需要:

 23
 173
 54
 2
 one two three
 one two three

疯狂的代码答案:

Document doc = Jsoup.connect("text.html").get();

        Elements params = doc.select("span[class=param]");
        int i;
        for (i=0; i<3; i++) {
        Element param = params.get(i);

        Node node = param.nextSibling();

        System.out.println(node.toString());
        }

        for (i=4; i<5; i++){

            Element apar = params.get(i);

            Node apan = apar.nextSibling();

            System.out.println("apar: "+apan.nextSibling().toString());
            System.out.println("apar: "+apan.nextSibling().nextSibling().nextSibling().toString());
            System.out.println("apar: "+apan.nextSibling().nextSibling().nextSibling().nextSibling().nextSibling().toString());
            //System.out.println(apan.nextSibling().toString());


        }
        for (i=5; i<6; i++){

            Element vih = params.get(i);

            Node vihn = vih.nextSibling();

            System.out.println("vih: "+vihn.nextSibling().toString());
            System.out.println("vih: "+vihn.nextSibling().nextSibling().nextSibling().toString());
            System.out.println("vih: "+vihn.nextSibling().nextSibling().nextSibling().nextSibling().nextSibling().toString());
            //System.out.println(apan.nextSibling().toString());


        }

    }

这个疯狂的(?)代码打印出我想要的。

【问题讨论】:

  • 你的node.toString() 打印什么?
  • 如果设置:get(0),则打印 23。如果设置 get(5),则打印
    。但我需要“一二三”
  • 现在您已经更新了问题,它变得不那么有意义了。您最初希望在 元素中获取数据。但是现在您正在尝试获取与 span 元素无关的随机数据,而是 元素中的实际数据。也许你可以描述一下你想要完成的事情。

标签: java html parsing jsoup nextsibling


【解决方案1】:

当您执行Element param = doc.select("span[class=param]") 时,您会返回一个元素列表。 您需要遍历列表以处理每个 &lt;span&gt; 元素。 在您的代码中,您只能通过 Element param = doc.select("span[class=param]").get(0); 获取一个

Document doc = Jsoup.connect("text.hml").get(); 
Elements params = doc.select("span[class=param]");
for(Element element: params){
    //Will print out the text contained within the <span>...</span>
    System.out.println(element.ownText());
}

params = doc.select("td");
for(Element element: params){
    //Will print out the text contained in all children nodes of <td> nodes, that are text nodes 
    System.out.println(element.ownText());
    //System.out.println(element.text());
}

上面的代码会打印出来:

Text0
Text1
Text2
Text3
Text4
Text5
23 173 54 2
one two three
one - two - three -

这应该足以让您到达目的地。祝你好运!

【讨论】:

  • 如果我使用每个 我不知道如何获取 nextSibling 值,Node 不适用于 Elements。
  • 文档 doc = Jsoup.connect("text.hml").get();元素参数 = doc.select("span[class=param]");诠释我; for (i=0; i
  • 我将使用@yar1k 评论更新答案,使其更具可读性。
  • 是的!谢谢,我更新了我的第一个Q,构造nextSibling().nextSibling().nextSibling().nextSibling().nextSibling().toString()) 正常吗?我可以使用更简单的代码吗?
  • 我已经更新了答案,向您展示如何获取包含在 标记中的文本以及 的所有子文本节点中的文本,这似乎就是您的身份之后。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
相关资源
最近更新 更多