所以我想要完成的是从网络系列中抓取一个 IMDB 网页以获取数据。问题是当我将页面转换为 DOM 对象并尝试获取值时,它并不像看起来那么容易。
例如:我使用 getElementsByTagName("h1") -> 它返回 1 个值,所以我知道我可以得到什么值(在这种情况下是节目的名称)。但是当我想提取节目评级时,它被隐藏在 Div 中并且很难查找。所以我尝试使用 getElementById(id of the element) 来获取该id的元素(div),这样我就可以缩短搜索时间。
但它返回一个空值?抓取此类页面的最简单方法是什么?
这是一个代码片段 public final class IMDBExtractor { private String imdbId;
public IMDBExtractor(String imdbId) {
this.imdbId = imdbId;
}
public synchronized TvShow extractTvShow() throws IOException {
TvShow show = new TvShow();
//access imdb url
URL url = new URL("http://www.imdb.com/title/" + imdbId);
URLConnection uc = url.openConnection();
uc.addRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
uc.connect();
//Tidy up HTML
Tidy tidy = new Tidy();
tidy.setXmlOut(true);
tidy.setShowWarnings(false);
Document doc = tidy.parseDOM(uc.getInputStream(), null);
//Set show attributes
show.setImdbId(imdbId);
show.setTitle(extractSeriesName(doc));
show.setRating(extractRating(doc));
return show;
}
private String extractSeriesName(Document doc) throws IOException {
return doc.getElementsByTagName("h1").item(0).getChildNodes().item(0).getNodeValue();
}
private Double extractRating(Document doc) throws IOException {
System.out.println(doc.getElementById("content-2-wide").getNodeName());
return null;
}
}
在这种情况下我要抓取的页面是: 箭头
所有 imdb 页面都有相同的模型,所以这不是问题,你们知道一个简单的方法吗?