私はオンラインゲームのための不和ボットを作成していますし、ボットの特徴の一つは、アイテムの情報を取得するためにウェブクローラを使用しています。
私の問題は、私はUTF-8でエンコードを使用する場合、URL Jsoupが何らかの理由で動作しないということです。
私は同じクラス名を持つ要素のすべてを反復処理しようとしましたが、それは全く仕事をしません。クラスが完全に欠けているように見えます。
String url = "http://coryn.club/item.php?name=";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(arguments.get(0));
for (int i = 1; i < arguments.size(); i++)
stringBuilder.append(" ").append(arguments.get(i));
url = url + URLEncoder.encode(stringBuilder.toString(), "UTF-8");
System.out.println(url);
Document document = Jsoup.connect(url).get();
Element table = document.getElementsByClass("table table-striped").first();
System.out.println(table == null ? "Table is null" : "Table is not null"); //returns that the table is null only on the %27 link
例えば、URL:http://coryn.club/item.php?name=dark+generalは完全に動作しますが、URL http://coryn.club/item.php?name=dark+general%27sしません。唯一の違いは、終了間際の27%です。
私は、クラス「テーブルテーブルストライプ」の要素にヌル値を入手できますか。
ただ、私は両方のURLの中に同じコードを使用しますが、最初のものだけが作業を行うことに注意すること。
また、ブラウザでページを開くならば、それは動作しますし、あなたはまだ検査要素にHTMLデータが表示されますことに注意すること。
あなたのような生(エンコードされていない)クエリデータを使用する場合、それは次のようになります
String url = "http://coryn.club/item.php?name=dark general's";
あなたは正しい結果が得られます。
これはJsoupは、フォーム内のデータを使用している場合ことをその手段、独自にそれらのパラメータを符号化することを示唆しているdark+general%27s
ことが含まれているために、最終的なURLを引き起こして再びエンコードされますdark%2Bgeneral%2527s
。
そのサーバーのため、それがの値が表示されます復号した後name
のようにdark+general%27s
、NOTなどdark general's
と検索し、それに合致する結果を見つけることに失敗します。そのため返されたHTMLには、結果表は存在しません。
だから、あなたのデータをコードしない、Jsoupはあなたのためにそれをやらせます。
ところで:あなたはまた、より多くの(IMO)読めるバージョンにコードを変更することができます
Document document = Jsoup
.connect("http://coryn.club/item.php")
.data("name", stringBuilder.toString()) //query parameters - don't encode manually
.get();
注意事項stringBuilder.toString()
当方でエンコードされていないが、それはのような生のデータが含まれていますdark general's
。
ところで2:場合はarguments
、例えば、文字列のようCharacterSequenceを含むように定義されList<String>
たJava 8代わりのため
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(arguments.get(0));
for (int i = 1; i < arguments.size(); i++)
stringBuilder.append(" ").append(arguments.get(i));
あなたが使用することができます
String joined = String.join(" ", arguments);
若しくは
String joined = arguments.stream().collect(Collectors.joining(" "));