首页
学习
活动
专区
圈层
工具
发布

Jsoup评级
EN

Stack Overflow用户
提问于 2016-08-03 19:29:35
回答 3查看 369关注 0票数 1

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

代码语言:javascript
复制
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”(我错误地编写了这个程序,我不知道为什么它是这样工作的,而不是相反的)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-03 19:44:56

您不需要这个程序中的元素e。网页中的titleColumn只包含电影的标题。考虑到你只需要收视率,这是不必要的。当我重命名为t并稍微清理代码时,您可以使用ratings元素:

代码语言:javascript
复制
    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查询。

票数 2
EN

Stack Overflow用户

发布于 2016-08-04 13:29:57

nicholas79171有一个很好的答案,但我只想指出,您可以使用CSS选择器直接针对评分,而无需使用所有dom遍历方法。

代码语言:javascript
复制
    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());
票数 1
EN

Stack Overflow用户

发布于 2016-08-03 19:42:51

您不能使用getElementsByClass来获取包含多个类的元素;它仅能奇异地工作;如果您想使用多个元素获取它们,您可以在您的Document上使用select。您可以阅读更多关于select如何工作这里的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38752131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档