2

オプションのリストがあるページへの HTML 投稿を生成しようとしています。ユーザーがアイテムを選択してから生成ボタンをクリックするドロップダウンリストがあります。選択したオプションに応じて、さまざまな結果が返されます。前後の HTML を比較したところ、次のように違いがわかりました。

<option value="Option1">Option 1</option>
<option value="Option2">Option 2</option>
<option value="Option3">Option 3</option>

<option value="Option1">Option 1</option>
<option selected="selected" value="Option2">Option 2</option>
<option value="Option3">Option 3</option>

jsoup ドキュメント生成の構文がわかりません。これまでのところ、これはありますが、元の HTML を返し続け、結果はありません。

doc = Jsoup.connect("MYurl...")
.timeout(5000)
.userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
.cookie("auth", "token")
.data("selected", "Option2")
.post();
4

1 に答える 1

6

属性によってnameフィールドの値を設定するには、データを使用する必要があります。

使用する場合:

.data("selected", "Option2")

リクエストしているページにこの要素があるのと同じですform( に注意してくださいname="selected"):

<select name="selected">
    <option value="Option1">Option 1</option>
    <option selected="selected" value="Option2">Option 2</option>
    <option value="Option3">Option 3</option>
</select>

したがって、あなたがしようとしている方法POSTは正しいです。問題はおそらく、指定されたパラメーター (フィールド)が (エミュレートしようとしている)selectedに存在しないため、formそれを送信することは何も送信しないことと同じです。

コメントの後に編集:

解析する前にWebページ要素をクリックする必要があり、私が理解していることから、これはJsoupでは実行できません。

あなたは正しいです。Jsoup はそれをサポートしていません。クリックには、JavaScript イベントなどのいくつかの副作用があります。それらを処理することは大したことです。

ただし、特定のケースでは、DOM を変更する jsoup の機能が役立つ場合があります。以下の例を確認してください。selectedその中で、属性を明示的に設定することでオプションを「選択」しますselected(そして、他のすべてのオプションから削除します)。

import org.jsoup.Jsoup;
import org.jsoup.nodes.*;
import org.jsoup.select.*;

public class JSoupChangeDom {
    public static void main(String[] args) {
        Document doc = Jsoup.parse(""+
        " <html><body>                                            " +
        " <div>example</div>                                      " +
        " <form>                                                  " +
        "    <select name='mySelect'>                             " +
        "       <option value='Option1'>Option 1</option>         " +
        "       <option value='Option2'>Option 2</option>         " +
        "       <option value='Option3'>Option 3</option>         " +
        "    </select>                                            " +
        " <form>                                                  " +
        " </body></html>                                          ");
        Element mySelect = 
                      doc.getElementsByAttributeValue("name", "mySelect").get(0);
        String optionValueToBeSelected = "Option2";
        Elements options = mySelect.getElementsByTag("option");
        for (Element option : options) {
            if (option.attr("value").equals(optionValueToBeSelected)) {
                option.attr("selected", "selected");
            } else {
                option.removeAttr("selected");
            }
        }
        System.out.println(doc);
    }
}

出力:

<html>
    <head></head>
    <body>
        <div>example</div>
        <form>
            <select name="mySelect">
                <option value="Option1">Option 1</option>
                <option value="Option2" selected="selected">Option 2</option>
                <option value="Option3">Option 3</option>
            </select>
        </form>
    </body>
</html>
于 2013-06-28T01:25:31.350 に答える