2011-10-20 6 views
0

J'essaye d'analyser un fichier html DTD non bien formé que je récupère par un flux d'entrée avec JSOUP, et récupère toutes les données dans les champs TD. Comment puis-je faire ça avec JSoup? J'ai déjà regardé le http://jsoup.org/cookbook/ mais je devrais avoir besoin d'un exemple pour le démarrer.JSoup analyse HTML

Merci d'avance.

J'ai déjà essayé le saxparateur mais je ne peux pas faire fonctionner la DTD.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-    strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl"> 
<TABLE class=personaltable cellSpacing=0 cellPadding=0> 
<TBODY> 
    <TR class=alternativerow> 
    <TD>Nieuw beltegoed:</TD> 
    <TD>€ 1,00</TD></TR> 
    <TR> 
    <TD>Tegoed vorige periode: 
    <TD>€ 2,00</TD></TD></TR> 
    <TR class=alternativerow> 
    <TD>Tegoed tot 09-11-2011: 
    <TD>€ 10,00</TD></TD></TR> 
    <TR> 
    <TD> 
    <TD height=25></TD> 
    <TR class=alternativerow> 
    <TD>Verbruik sinds nieuw tegoed:</TD> 
    <TD>€ 0,33</TD></TR> 
    <TR> 
    <TD>Ongebruikt tegoed:</TD> 
    <TD>€ 12,00</TD></TR> 
    <TR class=alternativerow> 
    <TD class=f-Orange>Verbruik boven bundel:</TD> 
    <TD class=f-Orange>€ 0,00</TD></TR> 
    <TR> 
    <TD>Verbruik dat niet in de bundel zit*:</TD> 
    <TD>€ 0,00</TD></TR> 
    </TBODY> 
</TABLE> 
</html> 

Edit: Je reçois un proche de la force, j'ai besoin du JSoup dans mon AsyncTask. Voici le LogCat:

10-20 21:07:36.679: ERROR/AndroidRuntime(1396): FATAL EXCEPTION: main 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396): java.lang.NullPointerException 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at com.sencide.AndroidLogin$MyTask.onPostExecute(AndroidLogin.java:276) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at com.sencide.AndroidLogin$MyTask.onPostExecute(AndroidLogin.java:1) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at android.os.AsyncTask.finish(AsyncTask.java:417) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at android.os.AsyncTask.access$300(AsyncTask.java:127) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at android.os.Looper.loop(Looper.java:130) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at java.lang.reflect.Method.invoke(Method.java:507) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
10-20 21:07:36.679: ERROR/AndroidRuntime(1396):  at dalvik.system.NativeStart.main(Native Method) 

Voici le code AsyncTask:

public class MyTask extends AsyncTask<String, Integer, String> { 
    private Elements tdsFromSecondColumn=null; 
} 

protected String doInBackground(String... params) { 
     InputStream inputStreamActivity = response.getEntity().getContent(); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStreamActivity)); 
       StringBuilder sb = new StringBuilder(); 
       String line = null; 

       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 

       /******* CLOSE CONNECTION AND STREAM *******/ 

       System.out.println(sb); 
       inputStreamActivity.close(); 

       String kpn; 
       kpn = sb.toString(); 

       Document doc = Jsoup.parse(kpn); 
       Elements tdsFromSecondColumn = doc.select("table.personaltable td:eq(1)"); 
} 

@Override 
    protected void onPostExecute(String result) { 
     //publishProgress(false); 
     TextView tv = (TextView)findViewById(R.id.lbl_top); 

     for (Element tdFromSecondColumn : tdsFromSecondColumn) { 
      //System.out.println(tdFromSecondColumn.text()); 
      tv.setText(""); 
      tv.setText(tdFromSecondColumn.text()); 
     } 
} 
} 

Répondre

5

, vous avez donc un InputStream et non une URL? Vous devez alors utiliser la méthode Jsoup#parse() qui prend une InputStream.

Document document = Jsoup.parse(inputStream, charsetName, baseUri); 
// ... 

Le charsetName devrait être le charset le document est codé à l'origine Vous pouvez le laisser null laisser Jsoup décider ou fallback en UTF-8. Le baseUri doit être l'URL à partir de laquelle le code HTML a été initialement diffusé. Vous pouvez le laisser null, vous ne serez pas en mesure de résoudre les liens relatifs.

Mais si vous avez réellement l'URL d'origine, vous pouvez aussi utiliser Jsoup#connect():

Document document = Jsoup.connect(url).get(); 
// ... 

Quelle que soit la façon dont vous avez obtenu le Document, vous pouvez utiliser CSS selectors pour sélectionner des éléments d'intérêt dans le document. Voir aussi le Jsoup cookbook on that subject. Voici un exemple qui extrait toutes les données de la 2e colonne du <table> avec un nom de classe de personaltable:

Elements tdsFromSecondColumn = document.select("table.personaltable td:eq(1)"); 

for (Element tdFromSecondColumn : tdsFromSecondColumn) { 
    System.out.println(tdFromSecondColumn.text()); 
} 

qui se traduit par:

€ 1,00 
€ 2,00 
€ 10,00 

€ 0,33 
€ 12,00 
€ 0,00 
€ 0,00 
+0

Salut BalusC, Merci beaucoup pour votre réponse , je vais essayer tout de suite quand je rentre du travail. J'ai d'autres questions, y at-il un moyen de rechercher une chaîne comme "Nieuw" dans les éléments TD, puis faire quelque chose comme tv.setText ("Nieuw beltegoed:" + tdFromSecondColumn.text()); Merci d'avance – Lars

+0

Vous pouvez utiliser le pseudo-sélecteur ': contains()': 'document.select (" table.personaltable td: contains ('Nieuw') ")'. Voir aussi le livre de recettes Jsoup sur le sujet: http://jsoup.org/cookbook/extracting-data/selector-syntax. – BalusC

+0

Salut BalusC, Thx fonctionne bien, mais j'ai le JSoup dans un AsyncTask, je reçois une force proche. J'ai modifié mon code avec le code Logcat et AsyncTask. Avez-vous le temps de nous aider? Merci d'avance. – Lars