2008-12-09 4 views
3

J'utilise XPath pour localiser un noeud (ou quelque chose de proche) dans un modèle qui a un code HTML mal formé d'environ 10 niveaux Profond. (Non, je n'ai pas écrit ce code HTML ... mais j'ai été chargé de le parcourir.)Recherche d'un noeud (ou proche de celui-ci) en utilisant XPath dans du HTML non bien formé

Il semble que je puisse récupérer un XPath sur l'élément en question en utilisant l'add-on XPartner pour Firefox ; Cependant, cela ne me donne que l'emplacement sur le site en direct, et pas dans le modèle que j'ai reçu. (Le modèle provient d'un langage de script côté serveur non standard et lit un langage interne)

Y a-t-il des outils XPath que vous connaissez et qui sont particulièrement efficaces dans le cadre d'un HTML mal formé.

Répondre

4

Les expressions XPath ne peuvent pas être évaluées par rapport à un document XML non-bien formé, qui est exactement le cas décrit.

Il est possible de le faire en deux étapes chaînées, la première consistant à convertir le code HTML en XML bien formaté, puis le second - à appliquer l'expression XPath. Par conséquent, la question pourrait être plus précisément définie comme "Comment convertir du HTML en XML afin que les expressions XPath puissent être évaluées par rapport à cela".

Voici deux bons outils:

  1. TagSoup, un programme open-source, est un Java et SAX - outil, développé par John Cowan. C'est un analyseur compatible SAX écrit en Java qui, au lieu d'analyser du XML bien formé ou valide, analyse le HTML tel qu'il est dans la nature: pauvre, méchant et brutal, bien que souvent loin d'être court. TagSoup est conçu pour les personnes qui doivent traiter ce genre de choses en utilisant un semblant de conception d'application rationnelle. En fournissant une interface SAX, il permet aux outils XML standard d'être appliqués même aux pires HTML. TagSoup inclut également un processeur de ligne de commande qui lit les fichiers HTML et peut générer soit du code HTML propre, soit du code XML bien formé proche de XHTML. Taggle est un port C++ commercial de TagSoup.

  2. SgmlReader est un outil développé par Microsoft Chris Lovett. SgmlReader est une API XmlReader sur tout document SGML (y compris la prise en charge intégrée de HTML). Un utilitaire de ligne de commande est également fourni qui produit le résultat XML bien formé. Téléchargez le fichier zip, y compris l'exécutable autonome et le code source complet: SgmlReader.zip

  3. The pure XSLT 2.0 Parser of HTML écrit par David Carlisle. Lire son code serait un excellent exercice d'apprentissage pour chacun d'entre nous.

partir de la description:

« d: htmlparse (string) d: htmlparse (chaîne, espace de noms, en mode html)

L'une forme d'argument est équivalent à) d: htmlparse (string, 'http://ww.w3.org/1999/xhtml', true()))

analyse la chaîne au format HTML et/ou XML en utilisant des heuristiques) intégré pour commande d'ouverture et de fermeture implicite d'éléments.

Il n'a pas une connaissance complète de la DTD HTML mais possède une liste complète des éléments vides et la liste complète des définitions d'entité. Les entités HTML et références de caractères décimales et hexadécimales sont toutes acceptées. Remarque Les entités html sont reconnues même si html-mode = false().

Les noms des éléments sont en minuscules (si html-mode est true()) et placés dans l'espace de noms spécifié par le paramètre d'espace de noms (qui peut être « » pour désigner sans espace de noms, sauf si l'entrée a explict déclarations d'espace de noms, en auquel cas ceux-ci seront honorés.

noms d'attributs sont en minuscules si html mode = true() »

Lire une description plus détaillée here.

+0

Merci homme! Je cherchais quelque chose comme ça pendant longtemps! Il y a beaucoup de mauvais code HTML là-bas! – leeand00

0

XPath ne fonctionne pas directement avec HTML. L'interaction de XPath avec votre HTML est dictée par n'importe quel logiciel/bibliothèque qui analyse le HTML dans un arbre de rendu. Cela peut vous aider à diriger votre recherche de manière appropriée.

Questions connexes