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:
SCRIPT
contenant des commentaires et / ou VBScript / JavaScript qui ressemblent à des éléments valides, etc. META
et LINK
dans les commentaires conditionnels IE. 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.)
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.
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.