【问题标题】:Jsoup POST: Defining a selected option to return HTML?Jsoup POST:定义选择的选项以返回 HTML?
【发布时间】:2013-06-27 15:14:32
【问题描述】:

我正在尝试为包含选项列表的页面生成 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();

【问题讨论】:

    标签: java android html jsoup


    【解决方案1】:

    您必须使用数据来设置字段的值通过其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 中不存在名为selected 的参数(字段)(您正在尝试模拟),因此发送它与不发送相同。

    评论后编辑:

    在解析之前我真正需要做的是在网页元素上执行点击操作,据我所知,这不能用 Jsoup 完成。

    你是对的。 Jsoup 不支持这一点 - 单击可能会产生一些副作用,例如 JavaScript 事件等。处理它们很重要。

    不过,对于您的具体情况,jsoup 更改 DOM 的功能可能很有用。检查下面的示例。在其中,我们通过将其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>
    

    【讨论】:

    • 我明白你的意思,但我认为我处理这个问题的方法都错了。我发现我可以使用 Jsoup 设置属性,但是当我将修改后的 HTML 发布回服务器时,它只会返回选中的选项。在解析之前,我真正需要做的是在网页元素上单击一下,据我所知can't be done with Jsoup.
    • 另外,因为我正试图在 Android 中执行此操作,所以 this 似乎是我最好的选择,但正如那里提到的那样,对于我想做的事情来说,这确实是矫枉过正。
    • 你是对的。作为补充,我编辑了答案。看看吧,也许会有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2013-02-04
    • 2018-10-23
    • 1970-01-01
    • 2020-11-22
    • 2014-10-29
    相关资源
    最近更新 更多