2014-01-14 49 views
1

我正在研究Java程序,該程序在啓動時需要從網站讀取數據。單擊按鈕以使其可見後解析HTML表

有問題的網站是這樣的:「加載原始數據」 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); 
     } 
    } 
} 
+1

請發佈一些你的代碼,你已經嘗試到現在 –

回答

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的常見問題解答頁面提供了幾個選項來克服它:

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

編輯: 嗯,我剛試過我上面的代碼(出於好奇,當然),並刮出整個數據您正在尋找的,下面的截圖:

enter image description here

希望它能幫助!

+1

完美的作品。非常感謝。 – zholmes1

0

看看你的鏈接,看起來好像所有的鏈接都是執行javascript代碼「load_table(); return false;」。這意味着您可以不通過單擊鏈接來發送這些命令,而是以這種方式訪問​​表。

0

該表的數據是動態的,並通過javascript生成。當您按下鏈接時,會發送ajax請求並收到數據。類似Jsoup的解析器無法處理動態元素,因爲它無法呈現JavaScript。檢查硒。它包含一個js引擎,所以你可以執行js然後解析數據。

編輯

一些挖後,我發現這個http://bitcoincharts.com/about/markets-api/。看起來,該頁面包含一個REST服務,您可以點擊並獲取所需的數據。也許這是獲取所需數據的更好方法,但它可能有一些使用限制。

相關問題