我可以更改 Jsoup 列表中的下拉项并提交吗?
Can I change a drop down item from a list in Jsoup and submit it?
我有一个网站,我正在尝试与JSOUP刮擦,该网站在选择不同的月或年份时具有每月和年度选择盒,其中数据会更改。编辑* 月份或年份一改数据就变,没有提交按钮。
默认值始终是我可以抓取的这个月和年,但我希望通过在下拉列表中选择不同的值来抓取前几个月和前几年的历史数据。
我可以找到放置下拉菜单的元素,但无论我尝试了什么,我都无法通过 Jsoup 进行选择和更改月份。是否可以更改“选项选择值”并通过 FormElement 提交?
我已经包含了代码和代码所基于的 System.out.println()。
Connection.Response resp = Jsoup.connect(url) //
.timeout(30000) //
.method(Connection.Method.GET) //
.execute();
Document doc = resp.parse();
Element pForm = doc.selectFirst("select:nth-of-type(2)");
System.out.println(pForm.toString());
// Result:
//<select name="month" size="1" style="background-color:#FFFFFF;text-align: left; font-family: Arial Narrow; font-size: 10" onchange="this.form.submit();"> <option value="June">June</option> <option value="July">July</option> <option value="August">August</option> <option value="September">September</option> <option value="October">October</option> <option value="November">November</option> <option value="December">December</option> <option value="January">January</option> <option value="February">February</option> <option value="March">March</option> <option value="April">April</option> <option selected value="May">May</option> </select>
您必须使用您在评论中描述的 <form>
发送 POST 请求(而不是 GET)。 onchange-event 只是在您更改下拉列表的值后立即提交表单。
根据 https://jsoup.org/cookbook/input/load-document-from-url 上的文档,您将添加表单数据并像这样发送请求:
Document doc = Jsoup.connect(url)
.timeout(30000)
.data("month", "June")
.post();
这会将“fixtures”select 设置为值“June”。请注意,您的 url
指向表单操作 ("fixturesall.php"),因为 HTML 不包含任何与您从中请求初始页面的路径相关的路径。
由于屏幕截图显示了多个 select,因此可能需要向您的表单请求添加更多参数。我不确定(没有测试)JSoup 是否允许添加对 .data()
的多个调用,或者一个数据调用是否替换了前一个。根据 JavaDoc 我认为数据加起来。
当然,您也可以提供包含多个 key-value 对的 Map
到 data()
。
我有一个网站,我正在尝试与JSOUP刮擦,该网站在选择不同的月或年份时具有每月和年度选择盒,其中数据会更改。编辑* 月份或年份一改数据就变,没有提交按钮。
默认值始终是我可以抓取的这个月和年,但我希望通过在下拉列表中选择不同的值来抓取前几个月和前几年的历史数据。
我可以找到放置下拉菜单的元素,但无论我尝试了什么,我都无法通过 Jsoup 进行选择和更改月份。是否可以更改“选项选择值”并通过 FormElement 提交?
我已经包含了代码和代码所基于的 System.out.println()。
Connection.Response resp = Jsoup.connect(url) //
.timeout(30000) //
.method(Connection.Method.GET) //
.execute();
Document doc = resp.parse();
Element pForm = doc.selectFirst("select:nth-of-type(2)");
System.out.println(pForm.toString());
// Result:
//<select name="month" size="1" style="background-color:#FFFFFF;text-align: left; font-family: Arial Narrow; font-size: 10" onchange="this.form.submit();"> <option value="June">June</option> <option value="July">July</option> <option value="August">August</option> <option value="September">September</option> <option value="October">October</option> <option value="November">November</option> <option value="December">December</option> <option value="January">January</option> <option value="February">February</option> <option value="March">March</option> <option value="April">April</option> <option selected value="May">May</option> </select>
您必须使用您在评论中描述的 <form>
发送 POST 请求(而不是 GET)。 onchange-event 只是在您更改下拉列表的值后立即提交表单。
根据 https://jsoup.org/cookbook/input/load-document-from-url 上的文档,您将添加表单数据并像这样发送请求:
Document doc = Jsoup.connect(url)
.timeout(30000)
.data("month", "June")
.post();
这会将“fixtures”select 设置为值“June”。请注意,您的 url
指向表单操作 ("fixturesall.php"),因为 HTML 不包含任何与您从中请求初始页面的路径相关的路径。
由于屏幕截图显示了多个 select,因此可能需要向您的表单请求添加更多参数。我不确定(没有测试)JSoup 是否允许添加对 .data()
的多个调用,或者一个数据调用是否替换了前一个。根据 JavaDoc 我认为数据加起来。
当然,您也可以提供包含多个 key-value 对的 Map
到 data()
。