2016-11-24 12 views
0

この問題に直面しているHtmlUnitとJsoupのウェブサイトを解析しようとしています。 私は解析するページが異なり、このページのこのリンクを文字列配列に保存しました。 配列の長さをループして各ページを解析したいので、このように処理します。いくつかの要素をGETPAGE方法で 4)解析をリンクから新しいHTMLページの作成および取得リンクのアレイ 2の長さにループ)を開く新しいWebクライアント 3)についてHtmlUnit:同じWebClientで新しいページを開く

1) Webクライアント 6)に戻る5)クロージング2)。

このようにして、私は欲しいものを手に入れていますが、コードは少し遅いです。だから私は開いて、ループの外側にwebClientを閉じようとしました。このように:

1)リンクの配列の長さにループのための新しいWebクライアント 2)を開く 3)GETPAGE方法 4)解析とのリンクから新しいHTMLページの作成といくつかの要素 5)は2に戻ってき) 。 6)ウェブクライアントをクローズ

これははるかに高速ですが、以前の方法と同じ結果が得られていません。

このように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

「例外」がありますか? –

+0

forループで@FredericKlein私はオッズ配列に格納されているいくつかのデータを取得しています。私はコードを実行する場合は、配列のすべての要素は同じですが、私は同じコードを実行するがforループの中でWebClientを作成する配列の要素は、(それがする必要があります)すべて異なっています。 例: 1)ループの内部Webクライアントと私は)exempleため( オッズ[0] = 4.00オッズ[1] = 3.00のオッズ外部Webクライアントとの[2] = 5.50オッズ[3] = 7.50 2)を得ますforループが得られる(例) オッズ[0] = 4.00オッズ[1] = 4.00オッズ[2] = 4.50オッズ[3] = 4。00 正しいページがロードされていないようです。 –

答えて

1

ブラウザの代わりにWebClientを考えてみましょう。新しいWebClientを作成することは、新しいブラウザを起動するようなものです。 ブラウザで新しいタブを開く場合は、WebClient#openWindow(..)を使用します。そして、記憶の観点からは、完了したらウィンドウを閉じることをお勧めします。

パフォーマンスを探している場合、ページ全体を再解析するのはなぜですか? HtmlUnitはページを取得し、ページを解析し、DOM全体を作成し、getPage呼び出しからページを戻す前にこのdomの上にjavascriptを実行します。 次に、HtmlUnitを使用してDomツリーをHtmlにシリアル化し、Jsoupを使用してページを再度解析します。 HtmlUnitは、ページ上の要素を検索するさまざまな方法を提供します。私はあなたが持っているページでこのAPIを直接使うことを提案しています。

+0

HtmlUnitですべてを行うことについてのあなたのanwer、ありがとうございました。私は深くAPIを見ていきます。 WebClientについて私はそれをブローワーと考えていたので、それが「第2の方法」を念頭に置いているのです。私がブラウザを起動していて、ページを見るのを終えて新しいページに移動する必要がある場合、ブラウザを閉じて新しいタブを開くかわりに、アドレスを変更するだけです。 –

関連する問題