首页 > 解决方案 > 如何在 Java 中使用 HtmlUnit 从页面获取“发布日期”动态值?

问题描述

作为一个简单的编码练习,我正在做一个小项目,将当前系统日期与几个网页中的日期进行比较(看看是否有新的更新)。对于他们中的大多数人来说,一切都很好,但是有一个给我带来了一些问题。

页面:https ://access.redhat.com/security/security-updates/#/security-advisories

我想要获得的价值:发布日期

问题:我怎样才能在Java中做到这一点?

尝试使用简单的 BufferedReader,尝试将整个页面保存到文件中 - 无济于事。我做了一些研究,似乎我需要使用 HtmlUnit,但我觉得我需要建议来了解它是如何工作的。

public static void main(String[] args) {

    Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
    System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");

    String START_URL ="https://access.redhat.com/security/security-updates/#/security-advisories";

    try{

        WebClient webClient = new WebClient(BrowserVersion.CHROME);

        webClient.getOptions().setCssEnabled(true);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.waitForBackgroundJavaScript(5000);

        HtmlPage page = webClient.getPage(START_URL);
        String pageContent = page.asText(); //this will NOT include dates
        System.out.println(pageContent);


    } catch (IOException ex){
        ex.printStackTrace();
    }
}

}

我想从https://access.redhat.com/security/security-updates/#/security-advisories页面获取第一个“发布日期”框的内容,但是无论我尝试哪种方法,动态值永远不可见,也无法存储/检查。

标签: javascriptjavahtml

解决方案


你可以使用:

public static void main(String[] args) {
    try {

        WebClient webClient = new WebClient(BrowserVersion.CHROME);
        webClient.getOptions().setJavaScriptEnabled(true);

        HtmlPage page = webClient.getPage("https://access.redhat.com/security/security-updates/#/security-advisories");
        webClient.waitForBackgroundJavaScript(15000);
        HtmlTable table = (HtmlTable) page.getElementById("DataTables_Table_0");
        for (HtmlTableRow row : table.getRows()) {
            List<HtmlElement> timeElements = row.getElementsByTagName("time");
            if (timeElements.size() > 0) {
                HtmlElement timeElement = timeElements.get(0);

                // GET THE TIME FROM THE CELL
                String time = timeElement.getAttribute("datetime"); // time in format "2019-05-08T17:34:20Z"
                System.out.println("TIME: " + time);
            } else {
                // This row does not contain a element with time tag
            }
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

这是未经测试的,也许正确节点的路径有一些需要改变,但这应该给你一个开始:)

更新:我现在对其进行了测试,它正在将所需的时间打印到控制台。这是一种方法。HTMLUnit 中还有许多其他方法可以获取所需的 DOM 元素。我建议阅读入门文档->“查找特定元素”。


推荐阅读