Écriture D'un analyseur HTML

J'essaie actuellement (ou je prévois de tenter) d'écrire un programme simple (le plus possible) pour analyser un document html dans un arbre.

Après avoir googlé, j'ai trouvé beaucoup de réponses disant "Ne le faites pas, c'est fait" (ou des mots à cet effet); et des références à des exemples d'analyseurs HTML; et aussi un article plutôt emphatique sur pourquoi on ne devrait pas utiliser des expressions régulières. Cependant, je n'ai trouvé aucun guide sur la "bonne" façon d'écrire un analyseur. (Ce qui, par ailleurs, est quelque chose que j'essaie plus comme un exercice d'apprentissage que tout, donc j'aimerais bien le faire plutôt que d'en utiliser un premade)

Je crois que je pourrais faire un analyseur XML de travail juste en lisant le document et en ajoutant les balises / texte, etc. à l'arbre, monter un niveau chaque fois que je frappe une étiquette de fermeture (encore une fois, simple, pas de filetage de fantaisie ou d'efficacité requise à ce stade.). Cependant, pour HTML, toutes les balises ne sont pas fermées.

Ma question est donc la suivante: que recommanderiez-vous pour gérer cela? La seule idée J'ai dû le traiter de la même manière que le XML mais avoir une liste de balises qui ne sont pas nécessairement fermées chacune avec des conditions de fermeture (par exemple

Se termine sur ou la balise suivante).

Quelqu'un at-il d'autres suggestions (espérons-le mieux)? Est-il une meilleure façon de faire tout cela?

23
demandé sur Einacio 2011-08-25 18:26:50

5 réponses

Donc, je vais essayer une réponse ici -

Fondamentalement, ce qui rend l'analyse html "simple" (ne parlant pas de XHTML valide ici) différente de l'analyse xml, ce sont des tas de règles comme des balises <img>sans fin, ou, à proprement parler, le fait que même les balises HTML les plus négligées seront un peu rendues dans un navigateur. Vous aurez besoin d'un validateur avec l'analyseur, pour construire votre arbre. Mais vous devrez décider d'une norme pour HTML que vous voulez soutenir, de sorte que lorsque vous rencontrez une faiblesse dans le balisage, vous saurez que c'est une erreur et pas seulement du HTML bâclé.

Connaissez toutes les règles, construisez un validateur, puis vous pourrez construire un analyseur. c'est le Plan A.

Le Plan B serait, pour permettre une certaine résistance aux erreurs dans votre analyseur, ce qui rendrait l'étape de validation inutile. Par exemple, analysez toutes les balises et placez-les dans une liste, en omettant tous les attributs, de sorte que vous puissiez facilement opérer sur la liste, en déterminant si une balise est laissée ouverte ou n'a jamais été ouverte à tous, pour éventuellement obtenir un" bon " arbre de mise en page, qui sera une solution approximative pour la mise en page bâclée, tout en étant exact pour la mise en page correcte.

Espère que contribué à!

8
répondu Andreas Grapentin 2011-08-25 14:42:04

Le relâchement de HTML peut être pris en compte en déterminant les balises Open et close manquantes au besoin. C'est essentiellement ce qu'un validateur comme tidy fait.

Vous conserverez une pile (peut-être implicitement avec un arbre) du contexte actuel. Par exemple, {<html>, <body>} vous êtes actuellement dans le corps du document html. Lorsque vous rencontrez un nouveau nœud, vous comparez les exigences pour ce nœud à ce qui se trouve actuellement sur la pile.

Supposons que votre pile soit actuellement juste {html}. Vous rencontrez une balise <p>. Vous recherchez <p> dans une table qui vous indique qu'un paragraphe doit être à l'intérieur du <body>. Puisque vous n'êtes pas dans le corps, vous poussez implicitement <body> sur votre pile (ou ajoutez un nœud body à votre arborescence). Ensuite, vous pouvez mettre le <p> dans l'arbre.

Supposé que vous voyez un autre <p>. Vos règles vous indiquent que vous ne pouvez pas imbriquer un paragraphe dans un paragraphe, donc vous savez que vous devez faire sortir le <p> actuel de la pile (comme si vous aviez vu une balise close) auparavant pousser le nouveau paragraphe sur la pile.

À la fin de votre document, vous retirez chaque élément restant de votre pile, comme si vous aviez vu une balise close pour chacun d'eux.

L'astuce consiste à trouver un bon moyen de représenter les exigences de contexte pour chaque élément.

11
répondu Adrian McCarthy 2011-08-25 16:23:04

Depuis que la norme html5 existe, l'écriture d'un analyseur html n'est plus une connaissance des essais et des erreurs ou des Arcanes.

Au Lieu de cela, il vous suffit d'implémenter l'algorithme d'analyse standardisé .

5
répondu BeniBela 2013-10-30 21:55:35

Rude. Aller

HTML n'est pas XML. XHTML est XML. La plupart des sites Web sont HTML; certains sont XHTML. En XHTML, toutes les balises doivent être fermées (ou ne pas avoir de corps, qui est toujours fermé).

Si vous voulez écrire un analyseur HTML comme une expérience d'apprentissage, alors allez-y. Si vous voulez écrire le prochain "Greaterest HTML parserer" alors abandonnez-le. Apache (ou quelqu'un d'autre) gagne; l'information importante est: vous ne savez pas plus que les grands groupes qui se spécialisent dans L'analyse HTML.

À répondez à la question " Comment puis-je faire face à cela?"lisez la spécification W3C sur HTML. Il répond à votre question. Si votre réponse est "mais je ne veux pas trop" alors vous dites en fait "je suis un goofrocket paresseux qui veut faire semblant d'apprendre". Si tel est le cas, je vous suggère de supprimer le post et de passer à autre chose; L'équipe Microsoft IE a probablement quelques documents qui vous intéresseront.

Réponse Moins sévère

HTML n'est pas facile à analyser. À son plus lâche, vous n'avez pas besoin de tête ou de corps éléments et beaucoup de balises ne doivent pas être fermés. Une règle de base lors de L'analyse HTML est Si vous rencontrez un nouvel élément de bloc, fermez automatiquement l'élément de bloc précédent. Vous ne pouvez pas utiliser un analyseur XML standard pour cela, car HTML N'est pas XML.

Semblable à XML, vous devrez diviser votre document en éléments, y compris des éléments de texte libre.

XHTML est beaucoup plus facile car il doit être bien formé XML. Vous pouvez utiliser un analyseur XML pour cela.

4
répondu DwB 2011-08-25 15:27:11

Avez-vous essayé d'utiliser cette bibliothèque : http://simplehtmldom.sourceforge.net/ ?

F.

0
répondu guilb 2013-10-30 21:47:12