HtmlUnit - динамический контент не найден - PullRequest
0 голосов
/ 29 октября 2018

Мне не повезло с динамическим контентом, возвращаемым в объект HtmlPage при загрузке этой страницы: https://www.fangraphs.com/leaders/splits-leaderboards?splitArr=5&strgroup=season&statgroup=1&startDate=2018-03-01&endDate=2018-11-01&filter=IP%7Cgt%7C0&position=P&statType=player&autoPt=true&players=&pg=0&pageItems=30&sort=22,1&splitArrPitch=&splitTeams=false

Элемент "реакции на падение" пуст. Я пытаюсь найти привязку с текстом «Экспорт данных», чтобы я мог щелкнуть по нему и получить содержимое в виде потока.

Есть мысли о том, что я могу сделать, чтобы HtmlPage содержал динамический контент?

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

    webClient = new WebClient(BrowserVersion.CHROME);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getCookieManager().setCookiesEnabled(false);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.setAjaxController(new NicelyResynchronizingAjaxController());
    webClient.setJavaScriptTimeout(jsTimeout);
    updateJSErrorListener(webClient);

    int thisYear = year;
    if (isEarlySeason()) {
        thisYear = year - 1;
    }
    String leftyURL = "https://www.fangraphs.com/leaderssplits.aspx?splitArr=5&strgroup=season&statgroup=1&startDate=" + thisYear + "-03-01&endDate=" + year + "-11-01&filter=IP%7Cgt%7C0&position=P&statType=player&autoPt=true&players=&pg=0&pageItems=30&sort=22,1";

    HtmlPage page = webClient.getPage(leftyURL);

    HtmlAnchor leftyAnchor = null;
    HtmlDivision div = (HtmlDivision) page.getElementById("react-drop-test");
    List<HtmlElement> anchors = div.getElementsByTagName("a");
    for (DomElement anchor:anchors2) {
        if ((anchor.getAttribute("class").contains("data-export"))) {
            leftyAnchor = (HtmlAnchor) anchor;
            break;
        }
    }

    Page p = leftyAnchor.click();
    InputStream is = p.getWebResponse().getContentAsStream();
    List<List<String>> leftyCSV = readCSVFile(is);

1 Ответ

0 голосов
/ 29 октября 2018

И еще одна веб-страница, заполненная странными js. Итак, позвольте мне начать с некоторых общих советов:

  • не изменяйте конфигурацию по умолчанию, если она не нужна (или если вы не знаете, как это повлияет)
  • потому что ваша страница (или, по крайней мере, части) визуализируется с помощью javscript, вам придется подождать в каком-то месте

И наконец: вам нужна более новая версия HtmlUnit, чтобы выполнить работу, потому что javascript impl пропускает одну функцию , чтобы заставить код javascript, используемый этой страницей, работать.

Чтобы получить новую (SNAPSHOT) версию, у вас есть следующие опции:

С новейшей кодовой базой это сделает работу за вас:

String url = "https://www.fangraphs.com/leaders/splits-leaderboards?splitArr=5&strgroup=season&statgroup=1&startDate=2018-03-01&endDate=2018-11-01&filter=IP%7Cgt%7C0&position=P&statType=player&autoPt=true&players=&pg=0&pageItems=30&sort=22,1&splitArrPitch=&splitTeams=false";

try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {                                                                                                                                                                                                       
    webClient.getOptions().setThrowExceptionOnScriptError(false);                                                                                                                                                                                                                  

    HtmlPage page = webClient.getPage(url);                                                                                                                                                                                                                                        
    webClient.waitForBackgroundJavaScript(50000);                                                                                                                                                                                                                                  
    System.out.println("----------------");                                                                                                                                                                                                                                        
    System.out.println(page.asText());                                                                                                                                                                                                                                             

    HtmlDivision div = (HtmlDivision) page.getElementById("react-drop-test");                                                                                                                                                                                                      
    List<HtmlElement> anchors = div.getElementsByTagName("a");                                                                                                                                                                                                                     
    for (DomElement anchor:anchors) {                                                                                                                                                                                                                                              
        if ((anchor.getAttribute("class").contains("data-export"))) {                                                                                                                                                                                                              

            HtmlAnchor leftyAnchor = (HtmlAnchor) anchor;                                                                                                                                                                                                                          

            Page p = leftyAnchor.click();                                                                                                                                                                                                                                          
            System.out.println();                                                                                                                                                                                                                                                  
            System.out.println("----------------");                                                                                                                                                                                                                                
            System.out.println(p.getWebResponse().getContentAsString());                                                                                                                                                                                                           

            break;                                                                                                                                                                                                                                                                 
        }                                                                                                                                                                                                                                                                          
    }                                                                                                                                                                                                                                                                              
}                                                                                                                                                                                                                                                                                  
...