Java 使用JSoup转到aspx表单的下一页

Java 使用JSoup转到aspx表单的下一页,java,android,jsoup,Java,Android,Jsoup,我正在尝试使用JSoup转到aspx表单的下一页 我可以找到下一个按钮本身。我只是不知道该怎么办 其思想是,对于特定的表单,如果存在“下一步”按钮,我们将模拟单击并转到下一页。但是,只要我们进入下一页,除了模拟点击之外的任何其他解决方案都可以 // Connecting, entering the data and making the first request ... // Submitting the form Document searchResults = form.submit(

我正在尝试使用JSoup转到aspx表单的下一页

我可以找到下一个按钮本身。我只是不知道该怎么办

其思想是,对于特定的表单,如果存在“下一步”按钮,我们将模拟单击并转到下一页。但是,只要我们进入下一页,除了模拟点击之外的任何其他解决方案都可以

// Connecting, entering the data and making the first request

...

// Submitting the form
Document searchResults = form.submit().cookies(resp.cookies()).post();

// reading the data. Everything up to this point works as expected

...

// finding the next button (this part also works as expected)
Element nextBtn = searchResults.getElementById("ctl00_MainContent_btnNext");

if (nextBtn != null) {
    // click? I don't know what to do here.
    searchResults  = ??? // updating the search results to include the results from the second page
}
我还需要在进入下一页后更新结果

// Connecting, entering the data and making the first request

...

// Submitting the form
Document searchResults = form.submit().cookies(resp.cookies()).post();

// reading the data. Everything up to this point works as expected

...

// finding the next button (this part also works as expected)
Element nextBtn = searchResults.getElementById("ctl00_MainContent_btnNext");

if (nextBtn != null) {
    // click? I don't know what to do here.
    searchResults  = ??? // updating the search results to include the results from the second page
}
页面本身是www.somePage.com/someForm.aspx,因此我无法使用此处所述的解决方案:

我找不到任何其他建议

有什么想法吗?我错过了什么?用JSoup模拟点击是否可行?文件上什么也没说。但我相信人们能够浏览这些类型的表单

此外,我正在使用Android,因此我不能使用HtmlUnit,如下所述:


谢谢。

这不是Jsoup的工作Jsoup是一个解析器,它有一个很好的DOM API,可以让您像处理格式良好的野生HTML一样处理野生HTML,并且不会因为错误和不合理而受损

在您的特定情况下,可以通过递归查找链接和检索HTML页面,直接从应用程序中获取目标站点。差不多

private void scrape(String url) {
  Document doc = Jsoup.connect(url).get();
  // Analyze current document content here...
  // Then continue
  for (Element link : doc.select(".ctl00_MainContent_btnNext")) {
    scrape(link.attr("href"));
  }
}
但在一般情况下,您想要做的事情需要Jsoup提供更多的功能:一个能够解释HTML、CSS和Javascript的用户代理,它带有一个可编写脚本的API,您可以从应用程序调用该API来模拟点击。例如,硒:

WebDriver driver = new FirefoxDriver();
driver.findElement(By.name("next_page")).click();

Selenium不能捆绑在Android应用程序中,因此我建议您将Selenium代码放在服务器上,并使用一些REST API访问它。

在ASPX上分页可能会很痛苦。您所能做的最好的事情是使用浏览器查看它发送到服务器的数据参数,然后尝试在代码中对此进行模拟

我已经写过了,但是它使用univocity HTML解析器(这是一个商业封闭源代码)而不是JSoup

简而言之,您应该尝试使用
id=“aspnetForm”
获取
元素,并读取表单元素以生成下一页的POST请求。表单数据通常包含以下内容:

__EVENTTARGET = 
__EVENTARGUMENT = 
__VIEWSTATE = /wEPDwUKMTU0OTkzNjExNg8WBB4JU29ydE9yZ ... a very long string
__VIEWSTATEGENERATOR = 32423F7A
... and other gibberish
然后,您需要查看其中的每一个,并与浏览器发送的内容进行比较。有时,您需要从页面的其他元素获取值以生成类似的POST请求。您可能需要删除获得的一些参数—同样,使您的代码与浏览器的行为完全相同

经过一些(令人沮丧的)尝试和错误,你会得到它的工作。服务器应该返回一个管道分隔的结果,您可以对其进行分解和分析。比如:

25081|updatePanel|ctl00_ContentPlaceHolder1_pnlgrdSearchResult|
<div>
    <div style="font-weight: bold;">
        ... more stuff
|__EVENTARGUMENT||343908|hiddenField|__VIEWSTATE|/wEPDwU... another very long string ...1Pni|8|hiddenField|__VIEWSTATEGENERATOR|32423F7A| other gibberish
然后:

每个响应都会有更多的数据参数。但这在很大程度上取决于你的目标网站


希望这能有所帮助。

遵守XHR请求。检查单击“下一步”按钮时发生的情况。参考此答案并了解单击按钮时发生的情况。谢谢你们两位。我已经用过了。当我点击下一步时,我很难孤立和理解会发生什么。也许是因为我对检查员缺乏经验:p这是个好主意,但遗憾的是,这超出了我“被允许”为这个项目做的范围。看来我误解了Jsoup的目的。我要再看一遍文件。谢谢。Jsoup也许就足够了。这完全取决于特定的目标站点:如果是静态HTML,Jsoup将处理它,我为scrape routineYes提供了一个存根。我看到了。问题是我没有url。它是www.somePage.com/someForm.aspx,当我单击“下一步”按钮时,即使它更改了页面,url仍然保持完全相同。我知道它必须在内部进行一些更改,但我似乎无法通过inspector弄清楚是什么。数据是用XHR(JavaScript)加载的。99%如果没有像Selenium这样成熟的用户代理,您将无法做到这一点。完美的谢谢你的详细解释。这很有帮助。
  request.setDataParameter("__VIEWSTATE", viewState);