1

所以我想要完成的是从网络系列中抓取一个 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 页面都有相同的模型,所以这不是问题,你们知道一个简单的方法吗?

4

0 回答 0