lundi 2 novembre 2009

Parser une page HTML ou la transformer avec XSL

En Java, quelques outils open-source permettent de traiter comme un fichier xml une page HTML, même mal formée au sens xml (par exemple avec des balises non fermées type "<br>").

J'ai testé un peu les deux outils les plus connus htmlparser et CyberNeko ainsi qu'un troisième que je ne connaissais pas : validator.nu HTML Parser

Ce que j'ai noté :

htmlparser
  • pas de dépendances (pratique pour l'utiliser dans un projet)
  • le parsing se fait via une API propriétaire
  • il permet de construire un document en mémoire qu'on peut ensuite manipuler (pas terrible si on veut s'en servir sur des gros volumes)
  • l'outil peut charger une page directement depuis le web
  • assez pratique à utiliser pour réaliser un crawler de sites
  • projet peu actif (la dernière version stable date de juin 2006, autant dire que le projet est mort)
CyberNeko
  • dépend de Xerces dont il utilise l'API (assez gênant quand on l'utilise dans un projet vu qu'il ramène une version de XercesImpl ainsi que de xml-apis)
  • transforme une page en un document DOM (pas idéal pour les performances)
  • normalise tous les tags en html 4 (noms de tags en majuscules, attributs en minuscules) mais sans notion de namespace. Un peu surprenant.
  • projet actif (la dernière version stable date de septembre 2009)
  • donne de bon résultats en performances d'après le benchmark réalisé par le projet PortletBridge
Validator.nu HTML Parser
  • projet récent et actif
  • implémentation de l'algorithme de parsing standardisé html 5
  • pas de dépendances (pratique pour l'utiliser dans un projet)
  • permet de faire du SAX
  • permet de transformer directement un document via xslt
  • nécessite un parser xml pas trop ancien (ne fonctionne pas par exemple avec le plugin maven cargo et jetty embedded)
  • compilable avec GWT (ça peut servir ?)
  • attribue par défaut aux tags html le namespace xmlns="http://www.w3.org/1999/xhtml" donc il vaut mieux bien connaitre la manipulation des namespaces avant de s'en servir
Personnellement, je préfère largement le troisième qui m'a permis de transformer une page html non conforme xml en seulement quelques lignes de code et sans faire de DOM, uniquement en SAX et sans introduire de dépendances supplémentaires dans mon projet.