2016-08-03 5 views
1

私はimdb上の上位250の映画の名前と評価を読み、評価の平均を返すプログラムを書いた。私は私(私はページ上のHTMLに見れば、私は評価が配置されている場所、それは「ratingColumn imdbRating」を書き込む見るので私の質問は、なぜ「T」で、それは「imdbRatingを」必要があるのフォロープログラムにJsoup imdb評価

import java.io.IOException; 

import org.jsoup.*; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 
public class da { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    try { 


      Document doc=Jsoup.connect("http://www.imdb.com/chart/top").get(); 
      Elements e=doc.getElementsByClass("titleColumn"); 
      Elements t=doc.getElementsByClass("imdbRating"); 
      float suma=0; 
     for(int i=0;i<e.size();i++) 
      suma=suma+Float.parseFloat(t.get(i).text()); 

    System.out.println(suma/250); 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

} 

を持っていますこのプログラムを誤ってやったのですが、どうしてこのように動作しているのか分かりません)

答えて

2

このプログラムでは、要素eは必要ありません。ウェブページのtitleColumnには映画のタイトルだけが含まれています。評価だけが必要であると考えると、これは不要です。私は少しratingsに名前を変更し、コードをクリーンアップするときは、ちょうどt要素を使用することができます。

import java.io.IOException; 

import org.jsoup.*; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 
public class da { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     try { 

      Document doc = Jsoup.connect("http://www.imdb.com/chart/top").get(); 
      Elements ratings = doc.select(".ratingColumn.imdbRating"); 

      float suma = 0; 

      for(int i = 0; i < ratings.size(); i++) 
       suma = suma + Float.parseFloat(ratings.get(i).child(0).text()); 

      System.out.println(suma/250); 


     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

} 

にEDIT:を複数のクラスを持つ要素を選択するには、doc#selectを使用し、それになどのCSSクエリを渡す必要があります上記。

+0

私は他のものの名前を使用していたが、私は評価の問題を持っていたし、その部分を削除しただけで、正確に、あなたの質問が何であるかそう – User124235

+0

を評価できるようにすることを決めましたか? – nicholas79171

+0

"ratingColumn imdbRating"を使用していないのはなぜですか?これは列名ではありませんか? – User124235

0

getElementsByClassを使用して複数のクラスを含む要素を取得することはできません。それは単独でしか働かない。複数の要素でそれらを取得したい場合は、Documentselectを使用します。選択の仕組みについては、hereをご覧ください。

1

nicholas79171は良い答えがありますが、私はちょうどCSS Selectorsを使用して、すべてのDOMトラバーサルメソッドを使わずに評価を直接ターゲットにできることを指摘したいと思います。

Document doc = Jsoup.connect("http://www.imdb.com/chart/top").get(); 

    float ratingSum = 0; 

    Elements ratings = doc.select("td.ratingColumn.imdbRating > strong"); 

    for (Element rating : ratings) 
     ratingSum += Float.parseFloat(rating.ownText()); 

    System.out.println(ratingSum/ratings.size()); 
+0

しかし、dom traversalメソッドは何をしていますか? (知識の欠如のために申し訳ありませんが、私はこれを学び始めました。この問題を解決するための速い方法を見つけ出し、実際に何が起こっているのか、それがなぜ働いているのかを理解したいと思います。) – User124235

+0

@ User124235 DOM )は基本的に大きな木構造です。木の特定の葉に乗りたい場合は、トランクに乗って大きな枝に登り、小さな枝に登り、最終的には葉に着くことができます。 CSSセレクタを使うと、はしごを使って欲しい葉に右に行くことができます。両方ともあなたを葉につかせますが、CSSセレクタは一般的にあなたのコードをよりクリーンにし、多くのエラー処理を必要としません。 –

+0

ok。それは意味をなさない。ありがとうございました – User124235