2016-08-03 3 views
1

Я написал программу, которая читает имя и рейтинг лучших 250 фильмов на imdb и возвращает среднее значение рейтинга. Я имею программу следовать по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(); 
    } 


} 

} 

Мой вопрос, почему в «т» она нуждается в «imdbRating», потому что если я смотрю в HTML на странице я вижу, что где рейтинг находится пишет «ratingColumn imdbRating» (I сделал эту программу по ошибке, и я не знаю, почему она работает именно так, а не наоборот)

ответ

2

В этой программе не нужен элемент e. titleColumn на веб-странице просто содержит название фильма. Учитывая, что вам нужны только рейтинги, это необязательно. Вы можете просто использовать t элемент, когда я переименовал в ratings и очищены ваш код немного:

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, чтобы получить элемент, который содержит несколько классов; он работает только сингулярно; Если вы хотите получить их с несколькими элементами, вы можете использовать select на своем Document. Вы можете узнать больше о том, как работает select here.

1

У nicholas79171 есть хороший ответ, но я хотел бы указать, что вы можете использовать CSS Selectors для прямого таргетинга, без всех методов обхода объекта.

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

но какие методы обхода дома? (извините за недостаток знаний, но я начал изучать это, и я хочу найти быстрый способ решения этих проблем и вместе с этим понять, что на самом деле происходит и почему оно работает или нет) – User124235

+0

@ User124235 DOM (Document Object Model) в основном представляет собой большую древовидную структуру. Подумайте об этом так, если бы вы хотели добраться до определенного листа дерева, вы могли бы подняться по стволу, вылезти на большую ветку, подняться на более мелкие ветки и, в конце концов, добраться до листа. С помощью селекторов CSS мы можем перейти прямо к листу, который мы хотим использовать с помощью лестницы. Оба получат вас на листе, но селектор CSS обычно оставляет ваш код более чистым и не требует такой обработки ошибок. –

+0

ОК тогда. это начинает иметь смысл. Спасибо – User124235

Смежные вопросы