Html Agility Pack peut-il être utilisé pour analyser des fragments HTML?

.net c# html html-agility-pack parsing

Question

Je dois obtenir les éléments LINK et META partir des pages ASP.NET, des contrôles utilisateur et des pages maîtres, récupérer leur contenu, puis réécrire les valeurs mises à jour dans ces fichiers dans un utilitaire sur lequel je travaille.

Je pourrais essayer d’utiliser des expressions régulières pour ne saisir que ces éléments, mais cette approche pose plusieurs problèmes:

  • Je m'attends à ce que beaucoup de fichiers d'entrée contiennent du HTML cassé (éléments manquants / hors séquence, etc.)
  • Éléments SCRIPT contenant des commentaires et / ou VBScript / JavaScript qui ressemblent à des éléments valides, etc.
  • Je dois pouvoir utiliser les commentaires conditionnels IE spéciaux et les éléments META et LINK dans les commentaires conditionnels IE.
  • Sans parler du fait que HTML n'est pas un langage courant

J'ai effectué des recherches sur les analyseurs syntaxiques HTML dans .NET et de nombreux posts sur SO et blogs recommandent le Pack d'agilité HTML . Je ne l'ai jamais utilisé auparavant et je ne sais pas s'il peut analyser du HTML cassé et des fragments HTML. (Par exemple, imaginez un contrôle utilisateur ne contenant qu'un élément HEAD contenant du contenu - pas de HTML ni BODY .) Je sais que je pourrais lire la documentation, mais que cela me ferait gagner un temps précieux. (La plupart des publications SO impliquent l'analyse de pages HTML complètes.)

Réponse acceptée

Absolument, c’est ce qu’elle excelle.

En fait, de nombreuses pages Web que vous trouverez dans la nature pourraient être qualifiées de fragments HTML, en raison de balises <html> manquantes ou de balises mal fermées.

HtmlAgilityPack simule ce que le navigateur doit faire - essayez de comprendre le sens de ce qui est parfois un fouillis de balises mal assorties. Une science imparfaite, mais HtmlAgilgityPack le fait très bien.


Réponse populaire

Une alternative au format HTML Agility Pack est CsQuery , un port C # jQuery dont je suis l'auteur principal. Il vous permet d’utiliser des sélecteurs CSS et l’API complète de Query pour accéder au DOM et le manipuler, ce qui est beaucoup plus facile pour beaucoup que XPATH. En outre, son analyseur HTML est conçu spécifiquement pour une variété d'usages et il existe plusieurs options pour analyser HTML: en tant que document complet ( html, body manquant html, body balises html, body seront ajoutées et tout contenu orphelin déplacé à l'intérieur du corps); en tant que bloc de contenu (ce qui signifie - il ne sera pas encapsulé dans un document complet, mais des balises facultatives telles que tbody qui sont toujours obligatoires dans le DOM, sont ajoutées automatiquement, comme le sont les navigateurs) et comme un véritable fragment ne contenant aucune balise créé (par exemple, dans le cas où vous travaillez uniquement avec des blocs de construction).

Voir créer un nouveau DOM pour plus de détails.

De plus, l'analyseur HTML de CsQuery a été conçu pour respecter les spécifications HTML5 relatives aux balises de fermeture facultatives. Par exemple, la fermeture des balises p est facultative, mais des règles spécifiques déterminent quand le bloc doit être fermé. Pour produire le même DOM qu'un navigateur, l'analyseur doit implémenter les mêmes règles. CsQuery fait cela pour fournir un haut degré de compatibilité avec le navigateur DOM pour une source donnée.

Utiliser CsQuery est très simple, par exemple

CQ docFromString = CQ.Create(htmlString); 
CQ docFromWeb = CQ.CreateFromUrl(someUrl);

// there are other methods for asynchronous web gets, creating from files, streams, etc.

// css selector: the indexer [] is like jQuery $(..)

CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];

// Text() is a jQuery method returning text contents of selection 

string textOfCell = lastCellInFirstRow.Text();

Enfin, CsQuery indexe les documents sur des classes, des identifiants, des attributs et des balises, ce qui en fait des sélecteurs extrêmement rapides comparés à Html Agility Pack.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi