k-p*_*rog 2 html java android jsoup
我正在尝试为包含选项列表的页面生成HTML帖子.有一个下拉列表,用户选择一个项目,然后单击一个生成按钮.根据所选的选项,它会返回各种结果.我之前和之后对HTML进行了比较,可以看到如下差异:
之前
<option value="Option1">Option 1</option>
<option value="Option2">Option 2</option>
<option value="Option3">Option 3</option>
Run Code Online (Sandbox Code Playgroud)
后
<option value="Option1">Option 1</option>
<option selected="selected" value="Option2">Option 2</option>
<option value="Option3">Option 3</option>
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚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();
Run Code Online (Sandbox Code Playgroud)
您必须使用数据按其name属性设置字段的值.
当你使用:
.data("selected", "Option2")
Run Code Online (Sandbox Code Playgroud)
与在请求页面上具有此元素相同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>
Run Code Online (Sandbox Code Playgroud)
所以,你尝试的方式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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4123 次 |
| 最近记录: |