2016-11-24 24 views
0

我想解析HtmlUnit和Jsoup的網站,我面臨這個問題。 我有不同的頁面解析,我將這些頁面的鏈接存儲在一個字符串數組中。 我想循環數組的長度和解析每一頁,我以這種方式進行。HtmlUnit:使用相同的WebClient打開新頁面

1)環上的鏈接的數組 2的長度)打開新Web客戶端 3)創建從鏈路新HtmlPage與GETPAGE方法 4)解析和得到一些元件 5)截止的WebClient 6)返回到2)。

這樣,我得到我想要的東西,但代碼是有點慢。所以我試圖在for循環之外打開並關閉webClient。像這樣:

1)上鍊路的陣列的長度打開新Web客戶端 2)對於循環 3)創建從鏈路新HtmlPage與GETPAGE方法 4)解析和得到一些元件 5)返回到2) 。 6)關閉WebClient的

它更速度更快,但我不獲取先前方式相同的結果。

這是錯誤的使用WebClient的構造以這種方式?

編輯: 下面的代碼我測試:

public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
     // TODO Auto-generated method stub 
     java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); 

     String[] links = {"http://www.oddsportal.com/tennis/china/atp-beijing/murray-andy-dimitrov-grigor-fTdGYm3q/#cs;2;6", 
          "http://www.oddsportal.com/tennis/china/atp-beijing/murray-andy-dimitrov-grigor-fTdGYm3q/#cs;2;9"}; 

     String bm = null; 
     String[] odds = new String[2]; 

     //Second way 
     WebClient webClient = new WebClient(BrowserVersion.CHROME); 
     System.out.println("Client opened"); 
     for (int i=0; i<links.length; i++) { 

      HtmlPage page = webClient.getPage(links[i]); 
      System.out.println("Page loaded"); 
      Document csDoc = Jsoup.parse(page.asXml()); 
      System.out.println("Page parsed"); 

      Element table = csDoc.select("table.table-main.detail-odds.sortable").first(); 
      Elements cols = table.select("td:eq(0)"); 

      if (cols.first().text().trim().contains("bet365.it")) { 
       bm = cols.first().text().trim(); 
       odds[i]=table.select("tbody > tr.lo").select("td.right.odds").first().text().trim(); 
      } 
      else { 
       Elements footTable = csDoc.select("table.table-main.detail-odds.sortable"); 
       Elements footRow = footTable.select("tfoot > tr.aver"); 
       odds[i] = footRow.select("td.right").text().trim(); 

       bm = "AVG"; 
      } 
      webClient.close(); 
     } 

     System.out.println(bm +"\t" +odds[0] + "\t" + odds[1]); 

} 

如果我運行這段代碼的結果是正確的。如果我移動webClient.close(); for循環結果之外是不正確的。特別是賠率[0]等於賠率[1];

+0

'但我沒有獲得以前的方式相同的結果'太籠統了;請更確切地說,結果是不同的。 –

+0

你是否收到任何'例外(S)? –

+0

@FredericKlein for循環我得到一些數據,我存儲在賠率數組中。如果我運行的代碼,我發佈該值數組的所有元素是相同的,而如果我運行相同的代碼,但在for循環內創建webclient數組的元素都是不同的(因爲它應該是)。例如: 1)with webclient在for循環中獲得(例如) 賠率[0] = 4.00賠率[1] = 3.00賠率[2] = 5.50賠率[3] = 7.50 2)with webclient outside我得到的for循環(例如) 賠率[0] = 4.00賠率[1] = 4.00賠率[2] = 4.50賠率[3] = 4。00 它似乎沒有加載正確的頁面 –

回答

1

想想WebClient作爲您的瀏覽器的替代品。創建一個新的WebClient就像啓動一個新的瀏覽器。 如果您喜歡在瀏覽器中打開一個新選項卡,可以使用WebClient#openWindow(..)。從記憶的角度來看,如果你完成了關閉窗口是一個好主意。

如果你正在尋找的表現,爲什麼你重新解析整個頁面Jsoup。 HtmlUnit檢索頁面,解析頁面,創建整個DOM並在您從getPage調用中取回頁面之前,在此dom上運行javascript。 然後,您使用HtmlUnit將Dom樹序列化回Html並使用Jsoup再次解析頁面。 HtmlUnit提供了許多方法來搜索頁面上的元素。我建議直接在你得到的頁面上使用這個API。

+0

感謝您的關注,特別是關於使用HtmlUnit完成所有事情的建議。我會深入研究API。 關於WebClient。我正在把它想象成一個大橋,這就是爲什麼它考慮到「第二種方式」。如果我正在運行瀏覽器,而且我已經完成了查看頁面的工作,並且需要新建一個頁面,那麼我只需更改地址,而不是關閉瀏覽器,然後重新打開它或進入新選項卡。 –