2016-08-03 58 views
1

我写了一个程序,它读取imdb上名列前250名电影的名称和评级,并返回评级的平均值。我有后续程序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(); 
    } 


} 

} 

我的问题是,为什么在“T”需要“imdbRating”因为如果我看的页面我看到那里的评价位于其写入“ratingColumn imdbRating”的HTML(我这个程序是错误的,我不知道它为什么这样工作,而不是其他方式)

回答

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查询像以上。

+0

我想使用的名称为其他事情,但我曾与评价的问题,并决定删除部分,只让评级 – User124235

+0

那么究竟什么是你的问题呢? – nicholas79171

+0

为什么使用“ratingColumn imdbRating”不起作用?这不是列名或什么? – User124235

0

您不能使用getElementsByClass来获取包含多个类的元素;它只能单独工作;如果您想让他们拥有多个元素,您可以在Document上使用select。您可以阅读更多关于选择作品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遍历方法在做什么? (对于缺乏知识抱歉,但我开始学习这一点,我想找到解决这个问题的快速方法,并与此一起来了解真正发生了什么以及为什么它工作与否) – User124235

+0

@ User124235 DOM(文档对象模型)基本上是一个大的树形结构。想想这样,如果你想要到一棵特定的树叶,你可以爬上树干,爬上一个大树枝,爬到较小的树枝上,最终到达树叶。使用CSS选择器,我们可以使用梯子直接转到我们想要的叶子。两者都可以让你进入叶子,但CSS选择器通常会让你的代码更清晰,并且不需要太多的错误处理。 –

+0

好的。它开始有意义。谢谢 – User124235