我写了一个程序,读取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();
}
}
}我的问题是为什么它不需要"imdbRating“,因为如果我查看页面上的html,我就会发现它的位置是"ratingColumn imdbRating”(我错误地编写了这个程序,我不知道为什么它是这样工作的,而不是相反的)。
发布于 2016-08-03 19:44:56
您不需要这个程序中的元素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查询。
发布于 2016-08-04 13:29:57
nicholas79171有一个很好的答案,但我只想指出,您可以使用CSS选择器直接针对评分,而无需使用所有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());发布于 2016-08-03 19:42:51
您不能使用getElementsByClass来获取包含多个类的元素;它仅能奇异地工作;如果您想使用多个元素获取它们,您可以在您的Document上使用select。您可以阅读更多关于select如何工作这里的信息。
https://stackoverflow.com/questions/38752131
复制相似问题