Aller au contenu

parser Html et expression régulière


tammikuu

Recommended Posts

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

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

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...