2017-08-10 79 views
0

所以我有這段使用JSoup的代碼,我認爲它不能正常工作(因爲JSoup的大部分事情需要至少一點修補才能正確)。但是,我一直試圖嘗試,但我的代碼不會在Android Studio中運行。最後,我試着用Eclipse和我的運氣,唉,同樣的代碼塊工作正常!當然,因爲我正在開發應用程序,所以我需要此代碼在Android Studio上運行,但我不知道該如何執行才能運行它!大塊代碼不能在Android Studio中工作,但在Eclipse中完美工作?

這裏是在Eclipse上運行的代碼塊,但沒有工作室:

String link= doc.select("div.searchTemplate.listLayout.so_us_en") 
         .select("div[id= topDynamicContent]") 
         .select("div.a-row.a-spacing-base.searchUndoAUIHacks") 
         .select("div.a-row") 
         .select("div.a-column.a-span8.a-spacing-none") 
         .select("div.s-first-column") 
         .select("h2.a-size-base.a-spacing-small.a-spacing-top-small.a-text-normal").first().text(); 
       System.out.println(link); 
       int listSize= Integer.parseInt(link.substring(2,4)); 
       System.out.println(listSize); 

,這裏是該工作室是給我的錯誤信息:

08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.jsoup.nodes.Element.text()' on a null object reference 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at com.velesapp.jsouptutorial.MainActivity$getProductAttributes.doInBackground(MainActivity.java:82) 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at com.velesapp.jsouptutorial.MainActivity$getProductAttributes.doInBackground(MainActivity.java:58) 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:305) 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
08-09 23:46:30.939 32525-532/com.velesapp.jsouptutorial W/System.err:  at java.lang.Thread.run(Thread.java:761) 

對於這兩種IDE中的導入完全相同,我通過Android Studio使用AsyncTask運行該進程,但未在Eclipse中使用任何線程。

下面是完整的代碼:

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 


import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 


public class MainActivity extends AppCompatActivity { 
    Button but; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     but = (Button)findViewById(R.id.but1); 
     but.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       new getProductAttributes("https://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Delectronics&field-keywords=rx+390").execute(); 


      } 
     }); 



    } 

    public class getProductAttributes extends AsyncTask<Void,Void,Void>{ 
     String url; 
     int listSize; 

     public getProductAttributes(String url){ 
      this.url = url; 
     } 
     protected Void doInBackground (Void... voids) { 
      try{ 
       Document doc = Jsoup.connect(url).get(); 
       String link= doc.select("div.searchTemplate.listLayout.so_us_en") 
         .select("div[id= topDynamicContent]") 
         .select("div.a-row.a-spacing-base.searchUndoAUIHacks") 
         .select("div.a-row") 
         .select("div.a-column.a-span8.a-spacing-none") 
         .select("div.s-first-column") 
         .select("h2.a-size-base.a-spacing-small.a-spacing-top-small.a-text-normal").first().text(); 
       System.out.println(link); 
       listSize= Integer.parseInt(link.substring(2,4)); 
       System.out.println(listSize); 

       }catch (Exception e){e.printStackTrace();} 

       return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 


     } 

感謝您的時間!

+1

您可以發佈[MCVE] – shmosel

+1

也許它與AsyncTask而不是IDE有關?你不能在eclipse中設置最新的android項目 –

+0

正如@suraj提到的 - ASyncTask - 你能爲我們提供你使用的完整Android Studio代碼(特別是ASyncTask)嗎? – r3dst0rm

回答

1

我檢查了你的代碼,它完全正常工作。另一方面,不起作用的是,您在div容器上的第一個選擇。

我的意思到底是:

doc.select("div.searchTemplate.listLayout.so_us_en") 

因爲listLayout DOM樹是不存在的。

我在你解析的網站上做了一些研究。您應該將listLayout更改爲:correctedResultsLayout

那麼這將導致以下:

String link = doc.select("div.searchTemplate.correctedResultsLayout.so_us_en") 
        .select("div[id= topDynamicContent]") 
        .select("div.a-row.a-spacing-base.searchUndoAUIHacks") 
        .select("div.a-row") 
        .select("div.a-column.a-span8.a-spacing-none") 
        .select("div.s-first-column") 
        .select("h2.a-size-base.a-spacing-small.a-spacing-top-small.a-text-normal").first().text(); 

除了我做了一些更改substring方法:

 System.out.println(link); 
     listSize = Integer.parseInt(link.substring(0, 2)); 
     System.out.println(listSize); 

,然後將打印在我的案例中發現結果的數量( :21)

注意:請記住,你可能必須改變這一點!

編輯:

你只是一個小建議或改進的問題。如果只搜索一個匹配的ID,會不會更好/更好?在這種情況下,您可以提高自己的代碼的可讀性。

供您選擇,這意味着 - 改變殺手doc.select(....)...語句轉換成更小更可讀:

String link = doc.select("h2#s-result-count").first().text(); 
+0

這工作,並以某種方式擺脫Studio中的NullPointerException,謝謝!另外,感謝您搜索匹配ID的提示,這比選擇一系列元素更有效。再次感謝! – coolyfrost

相關問題