Petit instrumenteur de page...

Dans ma quête du fichier aggrégé avec les résultats des régionales, je me suis dit, "pourquoi ne pas le récupérer directement sur le site du ministère de l'intérieur" ? Aussitôt dit, aussitôt pas fait évidemment, télécharger 20 pages et copier-coller les données dans Excel est une tâche insurmontable pour moi. D'où l'idée (pas originale, on fait ce qu'on peut) de les extraire des pages. Excel à partir d'une certaine version le fait très bien, on lui donne l'URL, il l'affiche, on sélectionne les tables à importer dans sa feuille de calcul, clic clic et c'est fini. Mais toujours 20 pages à faire, ça reste trop.

Etape suivante, le faire en PHP. 4 lignes plus loin, ça m'ennuie, la procrastination attaque. Bon, un langage que je ne connais pas alors ? Ruby, Python, Haskell, Perl, OCaml, Lisp, Logo, ... ? Bouof. En Java alors, ça me changera du boulot (mouais), au moins ce ne sera pas avec cette bouse de WebLogic. Première étape, trouver un parser HTML, celui de Swing étant éliminé d'office... j'avais déjà repéré celui de Quiotix, mais l'API ne me plaisait pas pour ce que je voulais en faire, pas assez souple. Le plus connu est sans doute JTidy (encore un site bien pourri, merci Maven, joli mais pas navigable pour un sou), mais faire de la validation ne m'intéresse pas. Ensuite je suis tombé sur Jericho HTML Parser, qui ne crée pas d'arbre... flûte, par contre ils listent des alternatives sur la page, dont CyberNeko HTML Parser qui repose sur le noyau de Xerces. Je veux faire quelque chose de léger et ne pas avoir 2 niveaux de dépendances ! Au suivant. Et je tombe sur HTMLParser, il construit un arbre, en permet la modification, permet les visiteurs, l'extraction de noeuds, la récupération facilitée de noeuds texte... et pas de dépendances externes. Retiendu.

172ko, un peu gros mais bon. Le travail commence, l'exploration du HTML du ministère est... ardue... la page rend bien, mais c'est limite du HTML 3.2, faites sauter la feuille de style et tadaaaa, aucune différence. Après avoir codé la récupération des liens vers les régions, la récupération des pages et celle de deux ou trois infos dans ces pages... ça m'exaspère. Il me faut un outil pour spécifier facilement l'endroit où pointer dans le HTML. Le pseudo-XPath à la OpenSTA me plaisait bien, mais je ne trouve pas trop d'outil pour, à part OpenSTA en lui-même, mais ça ne serait pas drôle. Et puis une chose me gêne dans leurs expressions : HTML(0)/BODY(5)/P(0) représente le premier paragraphe trouvé dans le 6ème noeud de l'élément HTML, qui se trouve être un BODY. Mais on n'en a rien à faire que BODY soit le 6ème où le 15ème fils ! Par contre savoir si j'ai la première ou la deuxième table dans le body, indépendamment des sauts de lignes entre, ça m'aide plus. La sémantique est changée, je ne peux plus utiliser OpenSTA :-)

Donc je le code tant qu'à faire... au final, c'est un peu décevant, un peu moins de 5ko de code source, et encore parce qu'il y a le copyright et tous les imports détaillés. Pour la personne qui sera tentée de l'utiliser un jour, le fonctionnement et le suivant :

  1. télécharger HTMLParser 1.4.
  2. Extraire le jar htmlparser.jar
  3. télécharger Instrumenteur.java
  4. compiler Instrumenteur.java (je doute que quelqu'un essaye un jour, mais faisons preuve de bonté : javac -classpath htmlparser.jar Instrumenteur.java, de toute façon avant il faut un SDK installé, développé en 1.4).
  5. l'instrumenteur est prêt !

Ensuite, il faut instrumenter le fichier : java -classpath htmlparser.jar;. net.cynicalturtle.divers.html.Instrumenteur mon_fichier.html. Il en ressort mon_fichier.html.instr.htm, testé dans Mozilla et Internet Exploder 6, qui vous affiche en permanence votre position dans le fichier, et sur un control-click ouvrira une fenêtre avec le chemin prêt à copier. Pourquoi personne ne devrait faire ça ? Parce que c'est certainement réalisable avec une bookmarklet je pense (moins une petite différence, l'arbre DOM présenté par les navigateurs est valide, même si le HTML source ne l'est pas, et nous ce qu'on veut c'est la position dans le HTML, pas dans le DOM). D'ailleurs, le code javascript est issu de la bookmarklet "ancestors" disponible sur la page mentionnée dans le lien précédent. Merveilleuse soirée de dimanche tout ça.