簡體   English   中英

使用JSoup轉到aspx表單的下一頁

[英]Going to next page on an aspx form with JSoup

我正在嘗試使用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
}

頁面本身是www.somePage.com/someForm.aspx,所以我不能使用這里所述的解決方案:

Android jsoup,如何選擇項目並轉到下一頁

我無法找到任何其他建議。

有任何想法嗎? 我錯過了什么? 使用JSoup可以模擬點擊嗎? 文檔沒有說明它。 但我相信人們能夠瀏覽這些類型的表格。

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

將HtmlUnit導入Android項目

謝謝。

這不是Jsoup的工作! Jsoup是一個具有良好DOM API的解析器,它允許您處理野生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提供的更多功能:能夠使用可編寫腳本的API解釋HTML,CSS和Javascript的用戶代理,您可以從應用程序調用它來模擬點擊。 例如Selenium:

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

Selenium無法捆綁在Android應用中,因此我建議您將Selenium代碼放在服務器上,並使用一些REST API進行訪問。

ASPX的分頁可能是一種痛苦。 您可以做的最好的事情是使用瀏覽器查看它發送到服務器的數據參數,然后嘗試在代碼中模擬它。

我已經寫了一個關於如何處理它的詳細教程,但是它使用了univocity HTML解析器(商業閉源)而不是JSoup。

簡而言之,您應該嘗試使用id="aspnetForm"獲取<form>元素,並讀取表單元素以生成下一頁的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

從這種響應中,您需要為后續頁面生成新的POST請求,例如:

 String viewState = substringBetween(ajaxResponse, "__VIEWSTATE|", "|");

然后:

  request.setDataParameter("__VIEWSTATE", viewState);

每個響應都會有更多的數據參數。 但很大程度上取決於您所定位的網站。

希望這有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM