66 votes

Quelle est la meilleure façon d'analyser le html en C# ?

Je suis à la recherche d'une bibliothèque/méthode pour analyser un fichier html avec des fonctionnalités plus spécifiques au html que les bibliothèques d'analyse xml génériques.

137voto

Mark Cidade Points 53945

Html Agility Pack

Il s'agit d'un analyseur HTML agile qui construit un DOM en lecture/écriture et supporte XPATH ou XSLT (vous n'êtes pas obligé de comprendre XPATH ou XSLT pour l'utiliser, ne vous inquiétez pas...). Il s'agit d'une bibliothèque de code .NET qui vous permet d'analyser les fichiers HTML "hors du Web". L'analyseur est très tolérant avec le HTML malformé du "monde réel". Le modèle d'objet est très similaire à ce que propose System.Xml, mais pour les documents (ou flux) HTML.

76voto

Compile This Points 4684

J'ai utilisé le HTMLAgilityPack sur un projet pour un employeur précédent et c'était plutôt efficace. Il n'était pas infaillible, mais il permettait de traiter la plupart des balises malformées, etc. que l'on trouve sur le Web de nos jours.

27voto

Erlend Points 2401

Vous pourriez utiliser TidyNet.Tidy pour convertir le HTML en XHTML, puis utiliser un analyseur XML.

Une autre alternative serait d'utiliser le moteur intégré mshtml :

using mshtml;
...
object[] oPageText = { html };
HTMLDocument doc = new HTMLDocumentClass();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(oPageText);

Cela vous permet d'utiliser des fonctions de type javascript comme getElementById().

4 votes

Traitez-moi de fou, mais j'ai du mal à comprendre comment utiliser mshtml. Avez-vous de bons liens ?

1 votes

@Alex vous devez inclure Microsoft.mshtml peut trouver un peu plus d'informations ici : msdn.microsoft.com/fr/us/library/aa290341(VS.71).aspx

0 votes

J'ai un billet sur Tidy.Net et ManagedTidy, qui sont tous deux capables d'analyser et de valider des fichiers (x)html. Si vous n'avez pas besoin de valider des choses. J'opterais pour le htmlagilitypack. jphellemons.nl/post/

16voto

Rob Volk Points 1293

J'ai trouvé un projet appelé Fizzler qui adopte une approche jQuery/Sizzler pour sélectionner les éléments HTML. Il est basé sur HTML Agility Pack. Il est actuellement en version bêta et ne prend en charge qu'un sous-ensemble de sélecteurs CSS, mais c'est plutôt cool et rafraîchissant d'utiliser des sélecteurs CSS plutôt qu'un méchant XPath.

http://code.google.com/p/fizzler/

1 votes

Merci, ça a l'air intéressant ! J'ai été surpris, avec la popularité de jQuery, qu'il ait été si difficile de trouver un projet C# qui s'en inspire. Maintenant, si seulement je pouvais trouver quelque chose où la manipulation de documents et la traversée plus avancée faisaient également partie du package... :)

0 votes

Je viens de l'utiliser aujourd'hui et je dois dire qu'il est très facile à utiliser si vous connaissez jQuery.

10voto

Alan Points 101

Vous pouvez faire beaucoup sans vous ruiner en produits tiers et en mshtml (i.e. interop). Utilisez le System.Windows.Forms.WebBrowser. À partir de là, vous pouvez faire des choses comme "GetElementById" sur un HtmlDocument ou "GetElementsByTagName" sur HtmlElements. Si vous voulez réellement interagir avec le navigateur (simuler des clics de bouton par exemple), vous pouvez utiliser un peu de réflexion (à mon avis un moindre mal qu'Interop) pour le faire :

var wb = new WebBrowser()

... dire au navigateur de naviguer (tangentiel à cette question). Ensuite, sur l'événement Document_Completed, vous pouvez simuler des clics comme ceci.

var doc = wb.Browser.Document
var elem = doc.GetElementById(elementId);
object obj = elem.DomElement;
System.Reflection.MethodInfo mi = obj.GetType().GetMethod("click");
mi.Invoke(obj, new object[0]);

vous pouvez faire des réflexions similaires pour soumettre des formulaires, etc.

Profitez-en.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X