tammikuu Posted October 13, 2011 Share Posted October 13, 2011 Bonjour, je cherche à récupérer le contenu d'un tableau HTML dans une appli, pour ce faire j'utilise cette fonction : public List<String> ExtractHeaders() { List<String> headers = new ArrayList<String>(); Pattern p=Pattern.compile("<th[^>]*>(.*)</th>"); Matcher m=p.matcher(table); while(m.find()){headers.add(m.group());} return headers; } le problème est qu'il me retourne une liste ne contenant qu'un string dans lequel sont concaténés tous les headers... idem en retournant un tableau de string ... Je pense donc que mon probleme vient de la boucle while(m.find()){headers.add(m.group());} mais je seche .... Link to comment Share on other sites More sharing options...
Androc Posted October 13, 2011 Share Posted October 13, 2011 Il n'y a pas un autre moyen que les expressions régulières pour parser un tableau HTML ? Un genre d'analyseur DOM qui te le présenterait facilement. Link to comment Share on other sites More sharing options...
tammikuu Posted October 13, 2011 Author Share Posted October 13, 2011 le truc c'est que les parseurs Html sont généralement assez lourd et long a mettre en oeuvre, surtout pour une utilisation telle que la mienne Link to comment Share on other sites More sharing options...
tammikuu Posted October 13, 2011 Author Share Posted October 13, 2011 je crois comprendre que cela vient du fait que while(m.find()){} ne "fait qu'un tour" et group toute les occurences du motif, il faut alors utiliser : public List<String> ExtractHeaders() { List<String> headers = new ArrayList<String>(); Scanner sc = new Scanner(table); Pattern p=Pattern.compile("<th[^>]*>(.*)</th>"); while(sc.hasNext()){ String mot = sc.next(); Matcher m = p.matcher(mot); while(m.find()){headers.add(m.group());} } return headers; } mais je dois faire une erreur car là je n'ai plus rien du tout ! surement au niveau du séparateur " " par défaut qui ne permet pas d'avoir les balises + le texte dans un mot or je n'ai pas de caractère spécial entre </th> et <th ... <table cellspacing="0"> <tr><th class="col col_xl2llx row_jbc5xa">Vous êtes</th><th class="col col_jealh1 row_jbc5xa">Vous entrez en</th><th class="col col_vd475m row_jbc5xa">Modalités</th><th class="col col_pjd7na row_jbc5xa">Date limite d'inscription</th><th class="col col_nj5zld row_jbc5xa">Durée des études</th></tr> Link to comment Share on other sites More sharing options...
tammikuu Posted October 13, 2011 Author Share Posted October 13, 2011 résolu en ajoutant un séparateur "><" : public List<String> ExtractHeaders() { List<String> headers = new ArrayList<String>(); Scanner sc = new Scanner(table); sc.useDelimiter("><"); Pattern p=Pattern.compile("th[^>]*>(.*)</th"); while(sc.hasNext()){ String mot = sc.next(); Matcher m = p.matcher(mot); while(m.find()){headers.add(m.group());} } return headers; } reste à nettoyer les residu de balises incompletes Link to comment Share on other sites More sharing options...
Androc Posted October 13, 2011 Share Posted October 13, 2011 Bon ben tant mieux alors. Cela me paraît tout de même bien compliqué d'avoir deux boucles pour récupérer des morceaux d'expressions rationnelles ... Link to comment Share on other sites More sharing options...
chpil Posted October 14, 2011 Share Posted October 14, 2011 Deux problèmes dans ton code initial: - l'expression régulière n'est pas assez restrictive et n'exclut pas les balises fermantes pour le contenu d'une balise - m.group() retourne l'expression complète matchée, pas le groupe défini dans l'expression Avec ces corrections, cela devrait fonctionner public List<String> ExtractHeaders() { List<String> headers = new ArrayList<String>(); Pattern p=Pattern.compile("<th[^>]*>([^<]*)</th>"); Matcher m=p.matcher(table); while(m.find()) { headers.add(m.group(1)); } return headers; } Link to comment Share on other sites More sharing options...
Androc Posted October 14, 2011 Share Posted October 14, 2011 Ca me paraît déjà plus dans la normalité ce code. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.