Jsoup imdb评级

时间:2016-08-03 19:29:36

标签: java jsoup

我写了一个程序,它读取imdb上前250部电影的名称和评级,并返回评级的平均值。我有以下程序

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();
    }


}

}

我的问题是为什么在&#39;它需要&#34; imdbRating&#34;因为如果我查看页面上的html,我会看到评级所在的位置,它会写入&#34; ratingColumn imdbRating&#34; (我错误地完成了这个程序,我不知道为什么它会以这种方式工作而不是另一种方式)

3 个答案:

答案 0 :(得分: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();
        }


    }

}

编辑:要选择包含多个类的元素,您必须使用doc#select并将其传递给上面的CSS查询。

答案 1 :(得分: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());

答案 2 :(得分:0)

您不能使用getElementsByClass来获取包含多个类的元素;它只能单独运作;如果您想要使用多个元素,可以在select上使用Document。您可以详细了解选择是如何工作的here