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

我正在开发一个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); } } } 

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

出于您的目的,您通过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 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

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

在此处输入图像描述

希望能帮助到你!

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

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

编辑

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