Jsoup POST:定义选定的选项以返回HTML?

时间:2013-06-27 15:14:32

标签: java android html jsoup

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

1 个答案:

答案 0 :(得分:5)

您必须使用数据按其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(您试图模仿)中不存在,因此发送它与发送任何内容相同。

评论后编辑:

  

我真正需要做的是在解析之前点击网页元素,根据我的理解,这不能用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>