3

私はこのウェブサイトからいくつかの情報を取得しようとしています:

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

テーブル構造は次のとおりです。

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

私のコード:

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

}
}

私が期待するもの:

Take the Eastern Suburbs and Illawarra train (CityRail)                                 

Dep: 12:35pm ; Hurstville Station Platform 3

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

私が試したこと:

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

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

実際にデータが入っているので

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

したがって、これを使用することはできなかったと思います(dataTblとwidthcol2and3の間のスペース):

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

だから私は試しました:

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

しかし、エミュレーターでテストアプリを実行しようとするたびに、

The application has stopped unexpectedly. Please try again.

ログは次のとおりです。

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

jsoup が適切なクラスを見つけられなかったようです。

セレクター構文が間違っていると思いますが、Use selector-syntax to find elements を見て、まだこの問題を解決できません。

この問題について私を助けてください。

4

2 に答える 2

1

どの行でどのような例外が発生しますか?

手始めに、catch()でこれを行わないでください:

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

接続中にエラーが発生した場合にのみ実行され、エラーが発生した場合、この時点でdocは常にnullになります。

次に、指定したコードを試してみると、接続タイムアウト例外がスローされます。これを試してください(私のために働きます):

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

また、id: "div#boxbody"で要素を選択しようとします。ここで、"boxbody"はクラス名の一部です。指定したリンクを開きましたが、「boxbody」という単語を含むクラス名のdiv要素が複数ありますが、クラスの名前全体ではありません。興味のあるクラス名は「boxbodyiewfix」だと思います。うまくいくかもしれませんが、Jsoupがスペースに奇妙に反応することがあることに気づきました(getElementsByClass( "boxbody iewfix")は私には機能しません)。

私はselectが好きではありません。私は通常、selectを使用しているときに多くの間違いを犯すので、代わりに次のようにします。

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

それで

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

戻ります:

「モードの​​詳細イースタンサバーブズとイラワラの電車(CityRail)に乗る出発:午後5時5分ハーストビル駅プラットフォーム3到着:午後5時31分市庁舎駅プラットフォーム5、シドニーこの旅行の地図ルート図代替時間」

于 2012-05-29T07:06:56.610 に答える
0

それはあなたが期待するものをあなたに与えるでしょう。

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");
于 2012-05-29T11:57:28.280 に答える