2017-12-29 5 views
0

So habe ich Probleme herauszufinden, wie man die Daten vollständig manipulieren, die ich mit Jsoup scraping. Ich weiß, wie man die Bereiche anvisiert, aber ich weiß nicht, wie man sie einzeln anvisiert, aber gruppiert sie immer noch.Jsoup - Daten abrufen und bearbeiten

Beispiel:

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

ich verschiedene Abschnitte in diesem HTML ausrichten möchten und legen Sie sie dann in Textviews auf eine bestimmte Weise. Aber wenn ich versuche, zum Beispiel div.panel-Überschrift & div.panel-Körper und ich möchte die Überschrift über den Körper setzen wird es alle div.panel-Überschriften für die gesamte Seite zuerst dann unter diesem dann wiederholen wiederhole alle div.panel-bodys. Man druckt sie in völlig getrennten Gruppen anstatt übereinander.

Unten ist der Code Ich verwende:

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 == - == - = -

I habe den HTML-Code geändert, um besser darzustellen, wie die Web-URL aussieht. Wenn ich meinen aktuellen Code ausführe, wird er angezeigt.

Heading1 
Heading2 
Heading3 
Heading4 

Body1 
Body2 
Body3 
Body4 

Ich möchte, dass es wie folgt angezeigt wird.

Heading1 
Body1 

Heading2 
Body2 

Heading3 
Body3 

Heading4 
Body4 

So im Wesentlichen, ich mag individuell, um den Panel-Position & Panel-Körper greifen, aber sie zusammen in einer Gruppe angezeigt werden. Ich kann sie beide in einer Gruppe finden, indem ich div.panel.panel-default auswähle, aber ich habe nicht so viel Kontrolle darüber, wie dies vom Standpunkt der Benutzeroberfläche aus angezeigt wird. Zumindest weiß ich nicht, wie ich diese Daten manipuliere, wenn ich alles so zusammenkratze.

EDIT ZWEI = - = - = - = - = - = - = - = -

Ich bin nah dran, dieser Code ermöglicht es mir, die Daten einzeln besser, zu manipulieren, aber kann immer noch nicht tun, was ich brauche . Ich möchte die Überschrift & Körper sagen, sagen wir verschiedene Farben. Ich kann das nicht herausfinden.

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

        } 

änderte mein runOnUIThread dazu:

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

Aber wenn ich die Textfarbe ändern für den Header unterscheidet sich von dem Körper mögen möchte ich bin nicht in der Lage. Oder fügen Sie eine Trennlinie zwischen allen Gruppen hinzu, erlaubt mir dies nicht. Es scheint nur sehr begrenzt auf der UI-Seite der Dinge, erlaubt es mir nicht, sie zu stilisieren, nur ziehen sie und zeigen sie an. Ich glaube, das liegt daran, dass es alles unter einem textView zieht, müsste ich sie in zwei verschiedene textViews einfügen? diese

+0

ich Ihre Frage nicht ganz verstehen kann. Ich habe den Code ausgeführt und getan, was er tun soll. Können Sie ein Beispiel geben, was Sie wollen? –

+0

@RizwanEjaz Ich habe meine Frage und den HTML-Code aktualisiert, um besser zu reflektieren, wie die URL aussieht.Ich habe auch hinzugefügt, was mein aktueller Code ausgibt und was ich ausgeben soll. –

Antwort

0

Versuchen:

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

aktualisieren Ich änderte Code

+0

Dies scheint genauso auszudrucken wie mein aktueller Code. Druckt immer noch alle Panel-Überschriften auf der Seite und druckt dann alle Panel-Körper-Sekunden. Ich habe meine Frage aktualisiert, um klarer darzustellen, was ich zusammen mit dem, was mein aktueller Code druckt, und was ich ausdrucken möchte. Vielen Dank! –

+0

Warten Sie, ich glaube, ich konnte Ihren Code ändern, damit er funktioniert. –

+0

Ich habe den Code sehr wenig geändert. Einfach einen Text zu einem StringBuilder hinzufügen –

Verwandte Themen