我想在我的应用程序 android 的列表视图中解析一个 html 页面,我正在为 android 开发。我希望这个应用程序解析一个 html 页面,但是当我启动应用程序时它崩溃了!我通过 logcat 得到了这个错误:
09-05 20:59:29.734 983-999/com.app.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NoClassDefFoundError: org.jsoup.Jsoup
at com.app.myapplication.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:84)
at com.app.myapplication.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:39)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
这是 Java AsyncTask 的代码:
private class ParsingPaginaWeb extends AsyncTask<String,String,String> {
ArrayList<String> titoli; //lista dei titoli
ArrayList<String> descrizioni; //lista delle descrizioni
@Override
protected void onPreExecute()
{
//prima di eseguire il parsing inizializzo gli arraylist
titoli = new ArrayList<String>();
descrizioni = new ArrayList<String>();
}
@Override
protected String doInBackground(String... params) {
/*
* Qui si effettua il parsing. Come esempio prendiamo il sito di anddev.it
* Questo, lo ripeto, � solo un esempio, in quanto il parsing cambia
* completamente in base al sito da cui prendere i dati.
*
*
* In questo caso vogliamo prendere dalla home di anddev.it i titoli
* delle varie sezioni del forum e la relativa descrizione.
* Quindi analizzando un po il codice html notiamo che:
*
* 1- La home � organizzata in tabella con classe "table_list"
*
* 2- All'interno c'� una alternanza di tbody con classe header e content.
* A noi interessano quelli con classe content
*
* 3- All'interno di ogni tbody con classe "content" ci interessa ogni riga con
* classe "windowbg2", che contengono i dati da recuperare
*
* 4- All'interno di ogni riga ci interessa il testo contenuto nel tag <a> con
* classe "subject" che contiene il titolo e quello nel tag <p>
* che contiene la descrizione.
*
* Adesso abbiamo tutte le informazioni che ci servono per fare il parsing
*/
try {
// NB: controllate di importare le classi giuste
// all'inizio ci deve essere org.jsoup
// ricavo l'html della pagina con user agent desktop (Chrome)
// e timeout 30000
Document doc = Jsoup.connect("http://mega-search.me/search?k=")
.userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
.timeout(30000).get();
// prendo la tabella
// (con .first() ottengo il primo elemento, in questo caso l'unico )
Elements links = doc.select(".link");
for( Element link: links )
{
String href = link.attr("href");
Elements titles = link.select( ".title" );
String title = ( links.size() > 0 ) ? links.get( 0 ).toString() : "";
titoli.add(title);
descrizioni.add(href);
}
// inserisco nei rispettivi arraylist
} catch (Exception e) {
// gestione dell'eccezione
// ad esempio mostrare messaggio di errore o altro (qui nel logcat)
Log.e("ESEMPIO", "ERRORE NEL PARSING");
}
return null;
}
@Override
protected void onPostExecute(String result)
{
// dopo che ho eseguito il parsing mostro i dati nella listview
// usando il custom array adpater ParsingArrayAdapter
ParsingArrayAdapter adapter = new ParsingArrayAdapter(MainActivity.this, titoli, descrizioni);
lista.setAdapter(adapter);
}
}