Jsoup Zugriff auf Kind im letzten DIV

Ich versuche mit Jsup Daten von einer Internetseite zu lesen. Mein Vorgehen ist wie folgt :

doc = Jsoup.connect(“http://www.die Seite”).get();
String contentText = doc.select("… div#feed_asset_1.long").first().text();
System.out.println(contentText);

Normalerweise sollte das klappen. der Wert den ich bemötige steht innerhalb des letzten DIV in childNodes. Wie kann ich darauf zugreifen. Ich hänge mal 2 Screenshot an, einem mit den Phatangaben und der 2. ist die DOM Panel untersuchung des letzten DIV. Soweit ich mitbekommen habe ist es ein long-Wert, und wenn ich den Namen des ChildNodes ermitte steht da #Text. Aber das ist nicht sicher. Jedenfalls erhalte ich keine Ausgabe der Zahlen. Ich habe es mit den Varianten unter versucht Das Resultat steht dahinter. Kann mir einer helfen bitte. Bitte keine Diskussion wegen illegal usw. Es ist legal. Da der Anbieter der Internetseite keine Benutzerschnittstelle hat, weiß er bescheid, das ich die Daten auslesen will für statistische Zwecke.
.last().toString()==>


.outerHtml() ==>

.first().text(); ==> …

Danke Gerald

Hm. Du willst die „1.38624“ haben. Und du bekommst schon den richtigen Knoten, der Ausgabe nach. Inwieweit war das

.first().text(); ==> …

eine Abkürzung für den Post hier? Also, er wird ja nicht drei Punkte ausgeben, und dem Muster der anderen Beispiele nach sollten die drei Punkte ja genau für die gesuchte Zahl stehen…!?

Ich komm einfach nicht an die Zahl ran. Ich weiß nicht was ich falsch mache. Nein es ist keine Abkürzung sondern in der Ausgabe von Eclipse stehen tatsächlich nur die 3 punkte, oder eben der Ausdruck hinter dem ==> . Ich werd langsamm irre ich hab alles probiert kein Erfolg. Deswegen hoffe ich einer kann mir sanft auf die Sprünge helfen oder wie auch immer. Ich hatte eben angenommen das der Wert nicht im Div steht sondern im ersten Child. Aber was ich auch mache, entweder Fehler keine Ausgabe oder eben das was ich gepostet habe. Ich bastel schon ne Woche und auch in Google finde ich nichts. Na ja mein Englisch ist halt nicht so gut, das ich was rauslesen könnte. Aber ich denke es kann nur eine Kleinigkeit sein.

Also mit einer Test-Datei


<hmtl>
  <head></head>
  <body>
      <div>
          <div class="long" id="feed_asset_1">123.456</div>
      </div>
  </body>
</html>

und folgendem Programm

import java.io.File;
import java.nio.charset.Charset;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JSoupTest
{
    public static void main(String[] args) throws Exception
    {
        File file = new File("JSoupTestInput.html");
        Document doc = Jsoup.parse(file, Charset.defaultCharset().toString());
        String contentText = doc.select("div#feed_asset_1.long").first().text();
        System.out.println(contentText);
    }
}

gibt er bei mir
123.456
aus. Kannst du das so weit bestätigen?

danke erst mal werd ich ausprobieren. hoff es klappt
Gerald

leider klappt das im Netz nicht. Fehlermeldung " (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)" sobald ich eine Seite mit http:\www… aufrufe. Die HP ist nicht auf dem Computer sondern im Netz. Hast du dafür auch eine Lösung ? Ich hatte es ja schon mit

[quote=gr170]doc = Jsoup.connect(“http://www.die Seite”).get();
String contentText = doc.select("… div#feed_asset_1.long").first().text();
System.out.println(contentText);[/quote] versucht.
Danke Gerald

Hm. Diese Meldung kann doch eingentlich nur kommen, wenn gerade versucht wird, das Dokument zu erstellen (und nicht bei der Suche, um die es ursprünglich ja ging). Oder… ?! Poste ggf. mal den Stack Trace.

Was soll ich posten bitte und wie mach ich das? ich kann dir die HTML Adresse schicken da kannst du es selber ausprobieren. Ich bin ja wie gesagt auch ratlos. Ich habe es auch schon mit dem kompletten Pfad versucht. Kein Resultat.
Danke Gerald

Der Stack Trace ist das, was mit der Fehlermeldung zusammen noch so alles ausgegeben wird (oder werden sollte). Kannst die Seite ja mal posten, notfalls ans PN wenn sie nicht hier verlinkt sein soll (werde aber erst morgen abend oder am Mi. genauer schauen können)

jo also es sind mit meinem Ansatz keine Fehlermeldungen aufgetreten. nur eben bringt er kein ergebnis außer den … Ich schick dir die seite mal PN eventuell kannst du was rausfinden. Danke Gerald

Hab’ mir die Seite gerade mal angeschaut: Dort steht drin


                <li class="currentPosition">
                    <div class="long" id="feed_asset_1">...</div>
                </li>

Kann es sein, dass er den Wert nur einsetzt, wenn man eingeloggt ist / irgendwelche Cookies gesetzt sind / man JavaScript aktiviert hat oder oder oder?

genau so ratlos bin ich auch
Da sich ja der Wert entsprechend ändert, dachte ich bisher was ich sehe ist auch zu händeln ich laß mir mal die Zugangsdaten geben .

Browserweiche am Server? JS generierter Content?

Ja, es gibt auf der Seite eine .JS-Datei, die zumindest auf dieses Element zugreift, und es scheint, als würde der Inhalt erst durch diese .JS gesetzt (aber die ist “obfuskiert”). Welche Möglichkeiten es da gibt, weiß ich nicht. Theoretisch könnte man zwar das .JS auslesen und ausführen, aber … das ist kaum praktikabel…

Theoretisch war gestern :wink:

Neben den üblichen Verdächtigen Web Extraction Wrappern (mozenda, etc.) gibt’s da auch noch die Möglichkeit in HtmlUnit mit dem JS-Support zu experimentieren, Selenium und einen echten Browser zu verwenden oder eine PhantomJS getriebene Lösung anzupeilen.

Ich hab’ die besten Erfahrungen mit der Fernsteuerung echter Browser und mit PhantomJS. HtmlUnit funzt’ bei komplexen Skripten sehr schlecht oder gar nicht. Je nachdem … Aber Probieren geht über studieren.

Puncto PhantomJS gibt’s das schon etwas angestaubte pjscrape. Aber es funktioniert. Ansonsten kannst du dir mit einem HTML Snapshot Tool (prerender ← sehr gut!, seoserver) das generierte HTML organisieren und darauf dann JSoup loslassen.

Ich sehe schon, dass da jemand diese Frage eher beantworten können wird, als ich :smiley:

da ich allerdings Anfänger bin, versteh ich erstmal Bahnhof und da ist meist nicht sehr viel zu verstehen. oh oh ich ahne schlimmes.

*** Edit ***

Also hab mir den link mal angesehen beim url ist klar, scraper steht offensichtlich wieder der CCSPfad also im beispiel oben „div#feed_asset_1.long“ . Was bedeutet " tr td:nth-child(2)" ? entspricht das dem 2. Kind. Also in meinem Fall giebt es nur ein Kind dann sollte es "tr td:nth-child(1) sein richtig? Aber wie gesagt ich bin Anfänger und fühl mich recht unwohl mit meinem gestocher.:frowning:
Und wieder alles Englisch ein Kraus.
Gerald

Ja, ich kann/konnte mit den Begriffen auch nichts anfangen. Schon die Frage “Wie bekommt man den Shice dann nach Java rüber?” könnte ich bisher nur beantworten mit “Hui, da müßte man mal schauen, vielleicht irgendwie mit der ScriptEngine aus dem JDK?!”… Sowas wie cookies und login-informationen sind da sicher weitere Stolpersteine…

Der?

:smiley:

Das bedeutet, dass du gern jedes zweite td-Element in einem jeden tr Element haben möchtest. Wenn’s nur um das erste Element geht und es nur eines gibt, reicht auch tr > td

Ich kann dir jetzt gar nicht sagen wo es eine gute Referenz gibt, da ich mir das in den letzten zwei Jahren über Stück für Stück immer weiter beigebracht habe. Aber prinzipiell sieht die Referenz ganz brauchbar aus: W3C Referenz.

Das hört nie ganz auf. Es gibt immer etwas wo man sich genau 0 auskennt und in erst einlesen muss. Nur Mut!

Am besten per Webservice-Call. node ist node und man sollte sich da nicht auch noch die Arbeit antun und etwas auf eine Rhino-Engine zu porten die für Node gedacht war. Wenn’s dann mit dem ganzen NPM-Krempel anfängt hast du meistens verloren. Es gibt allerdings für grüne Wiesenprojekte eine vielversprechende Implementierung auf Java-Basis: (ringojs)

Das ist alles kein Problem, darauf kannst du direkt in PhantomJS zugreifen.