3 Stimmen

Android Jsoup select() Fehler

Ich versuche, einige Informationen von dieser Website zu erhalten:

http://www.131500.com.au/plan-your-trip/trip-planner?itd_name_origin=hurstville&itd_name_destination=town+hall

Die Struktur der Tabelle ist:

<td headers="header2">
    Take the Eastern Suburbs and Illawarra train (CityRail)                                 
    <br />
    <b>Dep: 12:35pm&nbsp; Hurstville Station Platform 3</b>
    <br />
    <b>Arr: 1:06pm&nbsp; Town Hall Station Platform 5, Sydney</b>
    <br />
</td>

Mein Code:

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.os.Bundle;

public class JsouptestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    jsouptest();
}

public void jsouptest() {
    Document doc = null;
    try {
        doc = Jsoup
                .connect(
                        "http://www.131500.com.au/plan-your-trip/trip-planner?itd_name_origin=hurstville&itd_name_destination=town+hall")
                .get();
    } catch (IOException e) {
        Elements tables = doc.select("div#boxbody");
        System.out.println(tables.get(0).text().toString());
    }

}
}

Was ich zu sehen erwarte:

Take the Eastern Suburbs and Illawarra train (CityRail)                                 

Dep: 12:35pm ; Hurstville Station Platform 3

Arr: 1:06pm ; Town Hall Station Platform 5, Sydney

Was ich ausprobiert habe:

Elements tables = doc.select("div#boxbody table#dataTbl");

Elements tables = doc.select("div#boxbody table#dataTbl+widthcol2and3"); 

Da die Daten tatsächlich in

<table class="dataTbl widthcol2and3" cellspacing="0" style="margin:0px ! important;border-right:0px none;" summary="Search Results Details">

Also ich denke, ich könnte nicht nur diese (ein Leerzeichen zwischen dataTbl und widthcol2und3) verwenden:

Elements tables = doc.select("div#boxbody table#dataTbl widthcol2and3"); 

Also habe ich es versucht:

Elements tables = doc.select("div#boxbody iewfix"); // and div#boxbody+iewfix

Aber jedes Mal, wenn ich versuche, die Testanwendung im Emulator auszuführen, erhalte ich

The application has stopped unexpectedly. Please try again.

Das Protokoll sieht wie folgt aus:

05-29 15:58:42.575: W/dalvikvm(755): threadid=3: thread exiting with uncaught exception     (group=0x4001b188)
05-29 15:58:42.575: E/AndroidRuntime(755): Uncaught handler: thread main exiting due to uncaught exception
05-29 15:58:42.585: E/AndroidRuntime(755): java.lang.NoClassDefFoundError: org.jsoup.Jsoup
05-29 15:58:42.585: E/AndroidRuntime(755):  at com.yeasiz.jsouptest.JsouptestActivity.jsouptest(JsouptestActivity.java:25)
05-29 15:58:42.585: E/AndroidRuntime(755):  at com.yeasiz.jsouptest.JsouptestActivity.onCreate(JsouptestActivity.java:18)
05-29 15:58:42.585: E/AndroidRuntime(755):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-29 15:58:42.585: E/AndroidRuntime(755):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
05-29 15:58:42.585: E/AndroidRuntime(755):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
05-29 15:58:42.585: E/AndroidRuntime(755):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
05-29 15:58:42.585: E/AndroidRuntime(755):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
05-29 15:58:42.585: E/AndroidRuntime(755):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 15:58:42.585: E/AndroidRuntime(755):  at android.os.Looper.loop(Looper.java:123)
05-29 15:58:42.585: E/AndroidRuntime(755):  at        android.app.ActivityThread.main(ActivityThread.java:4363)
05-29 15:58:42.585: E/AndroidRuntime(755):  at    java.lang.reflect.Method.invokeNative(Native Method)
05-29 15:58:42.585: E/AndroidRuntime(755):  at java.lang.reflect.Method.invoke(Method.java:521)
05-29 15:58:42.585: E/AndroidRuntime(755):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-29 15:58:42.585: E/AndroidRuntime(755):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-29 15:58:42.585: E/AndroidRuntime(755):  at dalvik.system.NativeStart.main(Native Method)
05-29 15:58:42.595: I/dalvikvm(755): threadid=7: reacting to signal 3
05-29 15:58:42.595: E/dalvikvm(755): Unable to open stack trace file '/data/anr/traces.txt':      Permission denied

Es scheint, als ob die jsoup nicht die richtige Klasse finden konnte.

Ich glaube, meine Selektor-Syntax ist falsch, aber ich werde mir das ansehen Verwendung der Selektor-Syntax zum Auffinden von Elementen Ich kann dieses Problem immer noch nicht lösen.

Bitte helfen Sie mir bei diesem Problem.

1voto

Arie Punkte 5057

Welche Ausnahme erhalten Sie, bei welcher Linie?

Zunächst einmal tun Sie dies nicht in catch():

org.jsoup.select.Elements tables = doc.select("div#boxbody");
System.out.println(tables.get(0).text().toString());

Es wird nur ausgeführt, wenn beim Verbindungsaufbau ein Fehler auftritt, und wenn dies der Fall ist, wird doc an dieser Stelle immer null sein.

Zweitens führt der von Ihnen bereitgestellte Code zu einer Timeout-Ausnahme bei der Verbindung, wenn ich ihn ausprobiere. Versuchen Sie dies (funktioniert bei mir):

Document doc = null;
InputStream is = null;
String url = "http://www.131500.com.au/plan-your-trip/trip-planner?itd_name_origin=hurstville&itd_name_destination=town+hall";
is =new URL(url).openStream();
doc = org.jsoup.Jsoup.parse(is , "utf-8", url);
is.close();

Außerdem versuchen Sie, Elemente nach der ID "div#boxbody" auszuwählen, wobei "boxbody" ein Teil des Klassennamens ist. Ich habe den von Ihnen angegebenen Link geöffnet, und es gibt mehr als ein div-Element mit einem Klassennamen, der das Wort "boxbody" enthält, und es ist nicht der ganze Name der Klasse. Ich denke, der Name der Klasse, an der Sie interessiert sind, lautet "boxbody iewfix". Vielleicht funktioniert es, aber ich habe festgestellt, daß Jsoup manchmal seltsam auf Leerzeichen reagiert (getElementsByClass("boxbody iewfix") funktioniert bei mir nicht).

Ich mag Select nicht, da ich dabei zu viele Fehler mache, also würde ich stattdessen Select verwenden:

Elements tables = doc.getElementsByAttributeValueStarting("class", "boxbody"); //I checked, it works

Dann

tables.get(2).text(); // because the you're interested in third element which class name starts with "boxbody"

Sie wird zurückkehren:

"Modus Details Nehmen Sie den Eastern Suburbs and Illawarra Zug (CityRail) Abfahrt: 5:05pm Hurstville Station Platform 3 Ankunft: 5:31pm Town Hall Station Platform 5, Sydney Karte dieser Reise Routendiagramm Alternative Zeiten"

0voto

Das wird Ihnen geben, was Sie erwarten.

Elements lines = doc.select("td[headers=header2]");
String linesToStr = lines.text();
String[] linestoStrArray = linesToStr.split("\n");

for (String line : linesToStrArray)
    System.out.println(line + "\n");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X