Переход на следующую страницу в форме aspx с JSoup - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь перейти на следующую страницу в форме aspx, используя JSoup.

Я могу найти следующую кнопку сама. Я просто не знаю, что с этим делать.

Идея состоит в том, что для этой конкретной формы, если бы существовала следующая кнопка, мы имитировали бы щелчок и переходили на следующую страницу. Но любое другое решение, кроме симуляции клика, подойдет, если мы перейдем на следующую страницу.

Мне также нужно обновить результаты, как только мы перейдем на следующую страницу.

// 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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Нумерация страниц на ASPX может быть болезненной. Лучшее, что вы можете сделать, - это использовать ваш браузер для просмотра параметров данных, которые он отправляет на сервер, а затем попытаться эмулировать это в коде.

Я написал подробное руководство по его обработке здесь , но вместо JSoup используется HTML-анализатор однозначности (коммерческий закрытый исходный код).

Короче говоря, вы должны попытаться получить элемент <form> с 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

Из ответа ТА этого типа вам нужно сгенерировать новые POST-запросы для последующих страниц, например:

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

Тогда:

  request.setDataParameter("__VIEWSTATE", viewState);

В каждом ответе будет больше параметров данных. Но многое зависит от сайта, на который вы ориентируетесь.

Надеюсь, это немного поможет.

0 голосов
/ 26 июня 2018

Это не работа 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: пользовательский агент, способный интерпретировать HTML, CSS и Javascript с помощью API-интерфейса с поддержкой сценариев, который вы можете вызывать из своего приложения для имитации щелчка. Например Селен:

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

Selenium нельзя связать в приложении для Android, поэтому я предлагаю вам разместить свой код Selenium на сервере и сделать его доступным с помощью некоторого REST API.

...