我试图从高级标题搜索页面(http://www.imdb.com/search/title?count=250&title_type=feature&view=simple)抓取imdb精选影片,这是我的代码的一部分:
for(int start=1; start < 295378; start+=250)
try {
String baseUrl = "http://www.imdb.com/search/title?start="+start+";count="+count+"&title_type=feature&view=simple";
org.jsoup.Connection con = Jsoup.connect(baseUrl).userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21");
con.timeout(30000).ignoreHttpErrors(true).followRedirects(true);
Response resp = con.execute();
Document doc = null;
if (resp.statusCode() == 200) {
doc = con.get();
Elements myElements = doc.getElementsByClass("results").first().getElementsByTag("table");
Elements trs = myElements.select(":not(thead) tr");
一切顺利到100239号,我收到了这个错误:
java.lang.NullPointerException
at featuredfilms.cinemamovies.main(cinemamovies.java:44)
代码仍可用于1到100238号的电影,而且之后无法使用! 请原谅,如果这是显而易见的事情,因为我是Crawling和java的新手。我很感激,如果有人告诉我为什么会收到此错误,我该如何解决?
谢谢,
答案 0 :(得分:1)
可能是在一定数量的元素之后,返回的DOM结构与之前的页面不同,可能是因为它包含的元素较少。
我建议将此行拆分为单独的变量和方法调用,以跟踪这些链式语句中的哪一个在您的情况下返回null
。
Elements myElements = doc.getElementsByClass("results").first().getElementsByTag("table");
也许这样的事情会起作用(我不确定类型):
Elements elementsByClass = doc.getElementsByClass("results");
Element firstResult = elementsByClass.first();
Elements myElements = firstResult.getElementsByTag("table");
在这种情况下,当您发现返回null
的语句时,可以轻松添加空安全检查。
修改强>
如果您查看此链接以查看当您获得最大数字时会发生什么,它解释了为什么table.results元素不会出现在您的情况中: