tammikuu Posté(e) 13 octobre 2011 Share Posté(e) 13 octobre 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 .... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Androc Posté(e) 13 octobre 2011 Share Posté(e) 13 octobre 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
tammikuu Posté(e) 13 octobre 2011 Auteur Share Posté(e) 13 octobre 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
tammikuu Posté(e) 13 octobre 2011 Auteur Share Posté(e) 13 octobre 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> Lien vers le commentaire Partager sur d’autres sites More sharing options...
tammikuu Posté(e) 13 octobre 2011 Auteur Share Posté(e) 13 octobre 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Androc Posté(e) 13 octobre 2011 Share Posté(e) 13 octobre 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 ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 14 octobre 2011 Share Posté(e) 14 octobre 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; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Androc Posté(e) 14 octobre 2011 Share Posté(e) 14 octobre 2011 Ca me paraît déjà plus dans la normalité ce code. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.