【问题标题】:HtmlUnit - Dynamic Content not foundHtmlUnit - 找不到动态内容
【发布时间】:2018-10-29 01:55:51
【问题描述】:

加载此页面时在 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

“react-drop-test” div 为空。我正在尝试使用“导出数据”文本找到锚点,以便我可以单击它并将内容作为流获取。

有什么想法可以让 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);

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 Minimal, Complete, and Verifiable 示例
  • 已更新代码。

标签: java dynamic htmlunit


【解决方案1】:

还有一个网页充满了奇怪的 js。所以让我从一些一般性提示开始:

  • 如果不需要(或者如果您不知道这会产生什么影响),请不要更改默认配置
  • 因为您的页面(或至少部分)是由 javscript 呈现的,所以您必须在某个地方等待

最后:您需要更新版本的 HtmlUnit 来完成工作,因为 javascript impl misses one feature 可以让此页面使用的 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;                                                                                                                                                                                                                                                                 
        }                                                                                                                                                                                                                                                                          
    }                                                                                                                                                                                                                                                                              
}                                                                                                                                                                                                                                                                                  

【讨论】:

  • 感谢您提供的所有详细信息。我一直忙于工作,没有机会看这个。我会回来报告的。
  • 在此期间我提供了一个新快照。
  • 感谢您做出这些更改。它对我有用。您愿意分享一下您必须做出哪些改变吗?
  • 如果您想了解详细信息,请添加到 github 提交的链接。
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 2015-03-01
  • 2021-02-16
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多