2013-10-12 88 views
2

我對網頁抓取相當陌生,對Java知識有限。運行網頁抓取程序時出現「線程異常」主「java.lang.NullPointerException」錯誤

我每次運行此代碼,我得到的錯誤:

Exception in thread "main" java.lang.NullPointerException 

    at sws.SWS.scrapeTopic(SWS.java:38) 
    at sws.SWS.main(SWS.java:26) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 0 seconds) 

我的代碼是:

import java.io.*; 

import java.net.*; 

import org.jsoup.Jsoup; 

import org.jsoup.nodes.Document; 

public class SWS 
{ 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    { 
     scrapeTopic("wiki/Python"); 

    } 

    public static void scrapeTopic(String url) 
    { 
     String html = getUrl("http://www.wikipedia.org/" + url); 



     Document doc = Jsoup.parse(html); 

     String contentText = doc.select("#mw-content-text > p").first().text(); 

     System.out.println(contentText); 


    } 


    public static String getUrl(String Url) 
    { 
     URL urlObj = null; 

     try 
     { 
      urlObj = new URL(Url); 

     } 

     catch(MalformedURLException e) 
     { 
      System.out.println("The url was malformed"); 

      return ""; 
     } 


     URLConnection urlCon = null; 

     BufferedReader in = null; 

     String outputText = ""; 

     try 
     { 
      urlCon = urlObj.openConnection(); 

      in = new BufferedReader(new InputStreamReader(urlCon.getInputStream())); 
      String line = ""; 

      while ((line = in.readLine()) != null) 
      { 
       outputText += line; 

      } 

      in.close(); 
     } 

     catch(IOException e) 
     { 
      System.out.println("There was a problem connecting to the url"); 

      return ""; 

     } 

     return outputText; 



    } 

} 

我已經在我盯着屏幕的某個時候現在需要幫助的!

在此先感謝。

+0

哪一行是'SWS.java:38'? – ssantos

回答

4

在下面的代碼:

String contentText = doc.select("#mw-content-text > p").first().text() 

如果doc.select("#mw-content-text > p")沒有找到符合查詢並返回元素等元素調用first()應該給NullPointerException任何元素。

檢查Element.select的jsoup文檔頁面和Elements.first()

+1

合理的可能性,儘管正如我的回答中所指出的那樣,在運行OP代碼時並不會發生這種情況。不知道是誰downvoted或爲什麼,但有一個upvote! –

+1

感謝您的支持。可能對你的情況來說,它正在成功讀取html文檔,這意味着OP可能在'urlConnection'上失敗。 – Sage

0

在這一行

doc.select("#mw-content-text > p").first().text(); 

你doc.select顯然不發現任何東西,所以它返回null。然後你可以調用first()方法爲null,這就是爲什麼它以錯誤結束。

+0

我在想同樣的事情。 – DerpyNerd

+0

已投票支付無理由退款。雖然實際上,select不返回null,但是返回一個空元素。仍然是一個合理的懷疑。 –

0

您的代碼爲我工作得很好,正是因爲它是。

爲了調試和診斷其他答案是否可能出現錯誤,您最好使用一些臨時變量並在調試器中遍歷代碼。

public static void scrapeTopic(String url) 
{ 
    String html = getUrl("http://www.wikipedia.org/" + url); 
    Document doc = Jsoup.parse(html); 

    Elements select = doc.select("#mw-content-text > p"); 
    Element first = select.first(); 
    String contentText = first.text(); 

    System.out.println(contentText); 
} 
相關問題