Jsoup - 检索&操纵数据

时间:2017-12-29 03:46:02

标签: java android jsoup

所以我无法弄清楚如何完全操纵我正在使用Jsoup进行抓取的数据。我知道如何定位这些区域,但我不知道如何单独定位它们但仍将它们组合在一起。

例如:

<div class="panel panel-default">
    <div class="panel-heading">
        <p> Heading1 </p>
    </div>
    <div class="panel-body">
        <p> Body1 <p>
    </div>
</div>

<div class="panel panel-default">
    <div class="panel-heading">
        <p> Heading2 </p>
    </div>
    <div class="panel-body">
        <p> Body2 <p>
    </div>
</div>

<div class="panel panel-default">
    <div class="panel-heading">
        <p> Heading3 </p>
    </div>
    <div class="panel-body">
        <p> Body3 <p>
    </div>
</div>

<div class="panel panel-default">
    <div class="panel-heading">
        <p> Heading4 </p>
    </div>
<div class="panel-body">
    <p> Body4 <p>
</div>

我想在此HTML中定位不同的部分,然后以某种方式将它们放在textViews中。但是,当我尝试例如目标div.panel-heading&amp; div.panel-body我希望将标题放在正文上方,它将重复整个页面的所有div.panel标题,然后它将重复所有div.panel-bodys。它将它们打印在完全独立的组中,而不是一个在另一个上面。

以下是我正在使用的代码:

private void arbitrage() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            final StringBuilder builder = new StringBuilder();
            final StringBuilder builder2 = new StringBuilder();

            try {

                Document doc = Jsoup.connect("THE URL HERE").get();
                Elements links = doc.select("div.panel.panel-default > div.panel-heading");
                Elements links2 = doc.select("div.panel.panel-default > div.panel-body");

                for (Element link : links) {
                    builder.append("\n").append(link.text());

                    builder2.append("\n").append(links2.text() + "\n");

                }
            } catch (IOException e) {
                builder.append("Error : ").append(e.getMessage()).append("\n");
            }


            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    arbitrage.setText(builder.toString() + builder2.toString());
                }
            });



        }
    }).start();

}

== - = - = - = - = - = - EDITED = - = - = - = - = -

我更改了HTML代码,以更好地反映网址的外观。当我运行当前代码时,它会显示。

Heading1
Heading2
Heading3
Heading4

Body1
Body2
Body3
Body4

我希望它显示如下。

Heading1
Body1

Heading2
Body2

Heading3
Body3

Heading4
Body4

基本上,我想抓住面板标题&amp;单独的面板体,但将它们组合在一起。我可以通过选择div.panel.panel-default在一个组中抓取它们,但是我没有从UI的角度对它的显示方式进行过多的控制。至少我不知道如何操纵那些数据,当我把它们全部扫描出来时。

EDIT TWO = - = - = - = - = - = - = - = -

我越来越近了,这段代码让我可以更好地单独操作数据,但仍然无法满足我的需求。我想要标题和风格;身体让我们说不同的颜色。我无法弄清楚这一点。

 for (Element panel : panels) {
                        Elements links = panel.select("div.panel-heading");
                        Elements links2 = panel.select("div.panel-body");
                        builder.append("\n").append(links.text()).append("\n").append("\n").append(links2.text())
                                .append("\n")
                                .append("\n");

                    }

将我的runOnUIThread更改为:

  runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        arbitrageTextView.setText(builder.toString());
                    }
                });

但是如果我想要改变标题的文字颜色,那么我不能改变主体的颜色。或者在所有组之间添加分隔符,不允许我这样做。它在UI方面似乎非常有限,不允许我对它们进行样式化,只需将它们拉入并显示它们即可。我相信这是因为它将它全部放在一个textView下,我需要将它们放在两个不同的textView中吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

Elements panels = doc.select("div.panel.panel-default");

for (Element panel : panels) {
    Elements links = panel.select("div.panel-heading");
    Elements links2 = panel.select("div.panel-body");
    builder.append("\n").append(links.text());
    builder.append("\n").append(links2.text() + "\n");
}

<强>更新 我改变了代码