我写了一个程序,它读取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; (我错误地完成了这个程序,我不知道为什么它会以这种方式工作而不是另一种方式)
答案 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。