Aller au contenu

parser Html et expression régulière


tammikuu

Recommended Posts

Posté(e)

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 ....

Posté(e)

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.

Posté(e)

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>

Posté(e)

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

Posté(e)

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 ...

Posté(e)

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;
}

Archivé

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

×
×
  • Créer...