单击按钮以使其可见后解析HTML表

时间:2014-01-14 05:06:26

标签: java web-scraping html-table jsoup html-parsing

我正在研究一个需要在网站启动时从网站读取数据的Java程序。

有问题的网站是:http://bitcoincharts.com/charts/btceUSD#rg10zigHourlyztgSzm1g10zm2g25zv

要访问所需的表格,页面底部附近有一个标题为“加载原始数据”的按钮。单击时,会显示包含我需要的信息的表格。

虽然我以前从未这样做过,但我相信我可以轻松地学习如何解析表并将其放入某些数组中。但是,我无法弄清楚的是如何让我的程序“点击”该按钮以使表格显示。我怎么能这样做呢?

编辑:这是我现在正在使用的内容。目前这打印绝对没有,我怀疑这是因为jsoup没有看到表,因为“加载原始数据”按钮没有被“点击”。

for (Element table : doc.select("table[id=chart_table]")) {
    for (Element row : table.select("tr:gt(2)")) {
        Elements tds = row.select("td:not([rowspan])");
        for (Element element : tds) {
            System.out.println(element);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

要单击链接并执行其他交互式客户端脚本,您可能需要删除Jsoup并使用HtmlUnit。您将获得单击链接并刮取HTML页面所需的功能。

出于您的目的,您通过ajax访问包含动态数据填充的链接。要复制此方案,您必须捕获HtmlElement并通过单击再次呈现页面。

这样的事情:

final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17,
                YOUR_PROXY_HOST, YOUR_PROXY_PORT);

        WebRequest request = new WebRequest(
                new URL(
                        "http://bitcoincharts.com/charts/btceUSD#rg60ztgSzm1g10zm2g25zv"));

        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.setJavaScriptTimeout(10000);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        webClient.getOptions().setTimeout(10000);

        HtmlPage page = webClient.getPage(request);
        webClient.waitForBackgroundJavaScript(30000);

        List<HtmlAnchor> anchors1 = page.getAnchors();
        HtmlAnchor link2 = null;
        for (HtmlAnchor anchor : anchors1) {
            //System.out.println(anchor.asText());
            if (anchor.asText().indexOf("Load raw data") > -1) {
                link2 = anchor;
                break;
            }
        }
        page = link2.click();

现在您处理渲染的数据。可能就像:

HtmlTable table = (HtmlTable) page.getElementById("chart_table");
System.out.println("Here : - > " + table.asText());

我能看到的唯一复杂因素是它是一个ajax调用,几秒后渲染页面可能有点棘手。 HtmlUnit上的FAQ页面提供了一些选项来克服它:

http://htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork

修改 好吧,我刚刚尝试了上面的代码(出于好奇,当然)并且它会删除你要查找的所有数据,截图如下:

enter image description here

希望它有所帮助!

答案 1 :(得分:0)

查看您的链接,看起来好像所有链接都执行了javascript代码“load_table(); return false;”。这意味着您可以向页面发送这些命令,而不是单击链接,而是以相应的方式访问表格。

答案 2 :(得分:0)

该表的数据是动态的,并通过javascript生成。当您按下链接时,将发送ajax请求并接收数据。像Jsoup这样的解析器无法处理动态元素,因为它无法呈现javascript。检查硒。它包含一个js引擎,因此您可以执行js然后解析数据。

修改

经过一番挖掘后,我找到了http://bitcoincharts.com/about/markets-api/。该页面似乎包含一个REST服务,您可以点击并获取所需的数据。也许这是获取所需数据的更好方法,尽管它可能有一些使用限制。