2016-09-24 13 views
2

Я пытаюсь создать приложение с помощью java, которое будет читать информацию с веб-страницы. Чтобы загрузить информацию из элементов, которые я хочу, я использовал jsoup (отличный инструмент!), Но я хочу загрузить следующую страницу GridView, используемую на веб-странице. страница является страница .aspx и ссылка на 2-й странице такова:HTMLUnit в Java - Как перейти на страницы GridView

<a href="javascript:__doPostBack('GridView1','Page$2')" style="color:White;">2</a> 

Ниже функция Javascript используется:

//<![CDATA[ 
    var theForm = document.forms['form1']; 
    if (!theForm) { 
     theForm = document.form1; 
    } 
    function __doPostBack(eventTarget, eventArgument) { 
     if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
      theForm.__EVENTTARGET.value = eventTarget; 
      theForm.__EVENTARGUMENT.value = eventArgument; 
      theForm.submit(); 
     } 
    } 
    //]]> 

В настоящее время я пытаюсь сделать это с помощью HtmlUnit но выглядит как не работает. Ниже приведен код, я использую:

final WebClient webClient = new WebClient(BrowserVersion.CHROME); 
      HtmlPage page = webClient.getPage("http://www.webpage.com/Main.aspx");   
      HtmlAnchor anchor = null; 
      List<HtmlAnchor> anchors = page.getAnchors(); 
      for (int j = 0; j < anchors.size(); j++) 
      { 
       anchor = anchors.get(j); 
       String sAnchor = anchor.asText();    
       String sAnchorxml = anchor.asXml();   
       if (sAnchor.equals("2")) 
       { 
        HtmlPage page2 = anchor.click(); 
        doc = Jsoup.parse(page2.asXml()); 
        ..... 

Когда я прочитал страницу, используя один и тот же код, который я прочитал 1-ю страницу, я получаю следующее сообщение об ошибке:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
at java.util.ArrayList.rangeCheck(Unknown Source) 
at java.util.ArrayList.get(Unknown Source) 
at test.advacus.com.MainProgram.main(MainProgram.java:148) 

Я предполагаю, что моя ошибка в линия 'Jsoup.parse()'. Чтобы уточнить, что, как только вы нажимаете на следующую страницу, URL-адрес не изменяется, а только информация в GridView, поэтому я не могу проанализировать использование нового URL-адреса.

Любая дополнительная помощь или любой предлагаемый инструмент вместо HTMLUnit, который будет сотрудничать с jsoup лучше, действительно поможет! Спасибо заранее!

Edited для получения дополнительной информации: Похоже, это click(), что не работает ... Я изменил код и тело NEWPAGE выглядит она содержит ту же информацию, что и 1-й страницы:

final WebClient webClient = new WebClient(BrowserVersion.CHROME);  
HtmlPage page = webClient.getPage("http://www.qatarsale.com/EnMain.aspx");     
HtmlAnchor anchor = page.getAnchorByText("2");    
HtmlPage newPage = anchor.click();  
HtmlElement el = newPage.getBody(); 
System.out.println(el.asText()); 
+0

Вы можете разместить URL страницы? '__doPostBack', вероятно, вызовет запрос в фоновом режиме, который может быть воспроизведен с помощью jsoup. –

+0

Здравствуйте, F.Klein .... http://qatarsale.com/EnMain.aspx - это url ... doPostBack выглядит как передача параметра следующей страницы на сервер ASP.Net .... но, к сожалению, я не справился найти новый URL для этого – thpst

ответ

2

инспектирующей анкеры - как вы уже указывали - вызывается doPostBack, поэтому гораздо проще вызвать вызов javascript вместо того, чтобы сначала захватить якоря и щелкнуть по нему.

Пример кода

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); 
final WebClient webClient = new WebClient(BrowserVersion.CHROME); 

webClient.getOptions().setJavaScriptEnabled(true); 
webClient.getOptions().setThrowExceptionOnScriptError(false); 
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
webClient.getOptions().setTimeout(10000); 

try { 
    HtmlPage htmlPage = webClient.getPage("http://qatarsale.com/EnMain.aspx"); 

    Document doc = Jsoup.parse(htmlPage.asXml()); 

    System.out.println(doc.select("[id$=Label10]").text()); 

    ScriptResult result = htmlPage.executeJavaScript("__doPostBack('GridView1','Page$2')"); 
    htmlPage = (HtmlPage)result.getNewPage(); 

    Thread.sleep(3000); // delay needed for lazy loading, there might be something cleaner 

    doc = Jsoup.parse(((HtmlPage)htmlPage).asXml()); 

    System.out.println(doc.select("[id$=Label10]").text()); 

} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    webClient.close(); 
} 

Выход

Toyota Porsche Mercedes-Benz Cadillac Jeep Porsche Porsche Nissan Mitsubishi BMW Porsche Ford Mitsubishi Toyota Nissan Land Rover Nissan Mercedes-Benz Nissan Nissan Toyota Toyota Porsche Mitsubishi Mitsubishi Nissan Nissan Mercedes-Benz Nissan Jeep Mercedes-Benz Lexus BMW Lexus 
BMW Lexus Toyota Toyota Lexus Nissan Mercedes-Benz Mercedes-Benz Ferrari Dodge BMW Mercedes-Benz Aston Martin Mitsubishi Suzuki Maserati Porsche Maserati Land Rover Chevrolet Land Rover GMC Toyota Porsche Lexus Land Rover GMC Mercedes-Benz Toyota Lexus Toyota Lexus Toyota Nissan