begin process at 2012 02 09 18:48:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > PARSER HTML

PARSER HTML


 Information sur la source

Note :
9 / 10 - par 3 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Source .NET ( DotNet ) Classé sous :html, parser, dom, tag Niveau :Débutant Date de création :09/01/2007 Date de mise à jour :10/01/2007 16:15:11 Vu / téléchargé :18 465 / 1 298

Auteur : thiosyiasar

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce code est une lib qui permet d'accéder la structure d'une page HTML

Sa tolérance sur la qualité du code HTML est certes inférieur aux navigateurs mais suffisent pour la plupart des applis ou je l'ai utilisé

Source

  • (tout est dans le zip)
(tout est dans le zip)

 Conclusion

Bientot quand le html sera bien formaté, on pourra utiliser un parseur xml mais pour l'instant... n'hésitez par à le tester et a me faire parvenir l'url des pages qui mettre ce code a genoux :(

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

10 janvier 2007 16:15:11 :
Le projet est passé en .NET 2. Remplacement des ArrayList pas des listes génériques. J'ai ajouté une form pour que la démo soit un peu plus visuelle (voir capture) L'instance d'un document se fait désormais par la méthode statiques HtmlDocument.CreateDocument(Uri), qui teste la validité de l'url et du chargement de la page

 Sources du même auteur

Source .NET (Dotnet) COMPILATION ET RÉFLECTION
Source avec Zip Source avec une capture Source .NET (Dotnet) GESTION BASE DE CONNAISSANCE / CONCEPTION 3 TIERS
Source avec Zip Source .NET (Dotnet) GÉNÉRATEUR DE DOCUMENTATION (LIB POUR RÉFLECTION ET XMLDOC)
Source avec Zip Source avec une capture Source .NET (Dotnet) GÉNÉRATEUR DE SCRIPT SQL DE DONNÉES
Source avec Zip Source avec une capture Source .NET (Dotnet) EXPLORATEUR D'ASSEMBLY DANS UN TREEVIEW

 Sources de la même categorie

Source avec Zip Source avec une capture MODIFIER ADRESSE MAC (WINDOWS) par maxou561
Source avec Zip Source avec une capture FTPROG - CLIENT FTP TRÈS BASIQUE par Jukuso
Source avec Zip Source .NET (Dotnet) WIFIKEYVIEWER : LISTE DES PROFILES WIFI AVEC LEURS CLÉS/MOTS... par ShareVB
Source avec Zip Source .NET (Dotnet) TRANSFERT DE FICHIER par VinceMonkeyz
Source avec Zip Source .NET (Dotnet) NET (SCAN D'URL) par VinceMonkeyz

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) SCRUTER UNE PAGE WEB À LA RECHERCHE DES LIENS ET DES ADRESSE... par developper_man
Source avec Zip Source avec une capture Source .NET (Dotnet) PARSEUR HTML par Yxion
Source avec Zip Source avec une capture Source .NET (Dotnet) CS2GENLINQTOXML - XML + XPATH VISUALIZER + LINQ TO XML GENE... par romagny13
Source avec Zip Source avec une capture Source .NET (Dotnet) TRANSFORMATION D'UN XML À L'AIDE DE XSLT VERS HTML par EMSIEN
Source .NET (Dotnet) RÉCUPÉRATION DE TAGS MP3 par Moomoon07

Commentaires et avis

Commentaire de Bidou le 09/01/2007 19:26:16 administrateur CS

C'est assez dur de faire quelques chose qui tient la route dut à la souplesse de l'HTML bien sûr ;-)
Quelques remarques en vrac après une RAPIDE lecture:

- Dans la classe MainClass, l'url de teste (google) n'est pas valide.
- Pourquoi utiliser sans cesse le nom des classes (System.String, System.Boolean) plutôt que leurs mots clefs associés (string, bool) ?
- La méthode GetHtmlChars de HtmlChars retourne toujours null !?
- Détail: pour les types enum, on met en principe des MAJ
- Le code peut être simplifier à certains endroits, exemple:

if (iChars[pChar] == '"')
{
   bIsInString = !bIsInString;
   iAttributeLength++;
}
else
{
   iAttributeLength++;
}

devient

if (iChars[pChar] == '"') bIsInString = !bIsInString;
iAttributeLength++;

autres exemple avec oStackNode.Add(oNode); (peut-être y'en a encore d'autres)

- Les méthodes GetImageReferences, GetScriptReferences, GetLinkTagReferences et GetAnchorReferences sont très redondantes!
- Debug.WriteLine("VAL: '" + sTagValue + "'"); => Debug.WriteLine("VAL: '{0}'", sTagValue);


Voilà pour un début.
Sinon le code à l'air plutôt structuré...

Commentaire de thiosyiasar le 09/01/2007 19:45:23

effectivement...

ce code est ressorti d'une vielle valise!

une petite remise au propre s'impose...

merci pour tes remarques Bidou

(to be continued...)




Commentaire de GG29 le 09/01/2007 21:01:11

A la place de if(a == "") on peut utiliser if(a == String.Empty) ou encore
if(String.IsNullOrEmpty(a)) , ce qui est quand même plus jolie à mon goût.
Autrement ce code peut être pratique dans une appli.

Commentaire de badrbadr le 10/01/2007 12:27:34

Une alternative est d'utiliser le contrôle WebBrowser qui permet d'accéder à l'arbre DOM de la page html. C'est aussi tolérant que peut l'être Internet Explorer :)

Commentaire de thiosyiasar le 10/01/2007 13:16:35

C'est vrai, mais le probleme c'est que ce composant charge la page et toutes les ressouces images, scripts.... avant d'y donner l'accès (j'ai une appli qui l'utilise). Le temps de traitement donc plus lent et peu adapté à une analyse sur plusieurs pages.

( Je suis en train de remettre à jour avec une démo un peu plus visuelle :) et un code plus propre)


Commentaire de FREMYCOMPANY le 11/02/2007 18:05:38

J'ai lu dans un blog qu'un projet similaire au tiens avait vu le jour.
Je l'ai essayé et il me semblait que ca tenait la route...

Commentaire de thiosyiasar le 12/02/2007 03:25:03

Salut FremyCompany,

T'as plus d'infos sur le blog ou le projet ?

Commentaire de FREMYCOMPANY le 12/02/2007 16:48:13

Re-bonjour à toi, si je l'ai retrouvé, il s'agit de l'HTML Agility Pack
URL du blog http://www.csharpfr.com/code.aspx?ID=41034

Commentaire de sorcer1 le 26/03/2007 11:20:08

"le probleme c'est que ce composant charge la page et toutes les ressouces images, scripts...."
c'est pas vrai le composant WebBrowser ne charge pas les images, sauf si on l'utilise comme composant visuel!
ton html parser est vraiment plus leger et plus rapide de le WebBrowser en tout cas, par contre il ne gère les cookies et c'est bien dommage!
bravo quand même!

Commentaire de Zeroc00l le 14/08/2007 18:17:16

Au premier lancement j'ai oublié de regler mon firewall...
d'où une exception dans la clause finally de la fonction
"btnLoad_Click" !
la ligne "this._oHtmlDocument.Loading -= oLoadingEventHandler;"
provoque une NullReferenceException parce que "_oHtmlDocument" est à null.
Sinon sympa la source ... Ca m'évite d'avoir à faire une source pour reformater le code HTML d'une page :)

Commentaire de thiosyiasar le 15/08/2007 10:07:47

Salut Zeroc00l

Merci pour ton commentaire.

Cependant je pense que pour formater ton code html regarde plutot du coté du HtmlTextWriter qui est utilisé par ASP.net pour généré le rendu HTML

Ce code fait le contraire (il n'existe malheureusement pas  de HtmlTextReader...) enfin pas officiellement chez Microsoft

A+

Commentaire de Zeroc00l le 22/08/2007 02:12:31

Bon je viens d'utiliser réellement ta source cette fois ... et j'ai malheureusement de mauvaise nouvelles ... des bugs !

Si tu charges un fichier contenant : "<a><img/>Blablabla</a>"
Le Node qui correspond a "<a> ... </a>" a sa propriete "Value" à null et
le Node qui correspond a "<img/>" a sa propriete Value correspondant a "Blablabla".
Or si je ne m'abuse c'est le node "<a>" qui devrait contenir "Blablabla" !

Avec le code suivant : ""<a><b></b>Blablabla</a>" les deux nodes ont leur propriété "Value" à null, autrement dit "Blablabla" a disparu !

Pour l'instant ca ne m'a pas posé de problème sérieux.

Autrechose :
Quand ton parser tombe sur attribut genre href="..." il cree un HtmlAttribut. Ne devrait il pas enlever les double quotes de la valeur ? Les double quotes ne sont là que pour rendre l'xml plus lisible, il ne font pas parti de la valeur, donc d'après moi faudrait les virer ...

Bon ben bonne chance ! :)

P.S. : Merci pour l'info concernant le formatage de l'html

Commentaire de Zeroc00l le 22/08/2007 03:05:45

Oops y'a pas d'attribut "Value" pour les nodes .. je parlais de l'attribut "Tag.Value"
(d'ailleur j'ai mis Tag au pluriel dans tes sources !)

Quand je met l'URL d'un fichier qui n'est pas de l'HTML ça throw dans tous les sens !

Commentaire de thiosyiasar le 22/08/2007 17:48:05

Merci Zeroc00l pour ces tests ! ceux sont effectivement des bugs !

Je vais me libérer un peu de temps pour corriger ça !

A+

Commentaire de brlecler le 13/02/2009 11:09:39

Il y a plus largement, un problème sur les objets (les tags) imbriqués les uns dans les autres. Normalement c'est le genre de problème qui doit se traiter par la récursivité. Mais étant donné que par ailleurs ce code fonctionne bien, voici un correctif qui permet de bien traiter des imbrications du genre:
<div><span><b>BBB</b><strong>SSS</strong>SPSPSP</span>DIDIDI</div>

Dans le fichier HtmlDocument déclarer la classe:

        class TagLie
        {
            public CB_HtmlTag Tag;
            public TagLie Parent;
        }

Dans la méthode HtmlDocument:extracttags

dans le case '<' remplacer :

if (oTags.Count > 0)
oTags[oTags.Count - 1].Value = oValue;

par

TagActif.Tag.Value = oValue;

dans le case '>' , après la ligne oTags.Add(t); ajouter le bloc :

TagLie Nouveau = new TagLie();
Nouveau.Tag = t;
if (t.IsCloseTag)
{
  TagActif = TagActif.Parent;
}
else
{
  Nouveau.Parent = TagActif;
  TagActif = Nouveau;
}

Et ça va fonctionner beaucoup mieux...

Commentaire de thiosyiasar le 13/02/2009 12:58:45

Merci brlecler

Je vais me bloquer un peu de temps pour corriger tout ca et intégrer ton correctif.

A+

Commentaire de Mathrb le 13/03/2009 00:55:24 10/10

Merci
C'est ce que je cherchais

Commentaire de juliensmarties le 20/07/2010 11:09:14

Bonjour,

J'aurais souhaité savoir si tu avais mis à jour ton appli ? si oui ou puis-je la trouver ?
Si non comment faire un correctif pour récupérer un truc du type:

<a href="www.google.fr" title="Google">
   <span>&nbsp;</span>
   Google c'est par là
</a>

Comment faire pour pouvoir récupérer "Google c'est par là" ?

Merci à ceux qui me viendrons en aide

Ju

Commentaire de thiosyiasar le 29/11/2010 17:57:12

(non je ne suis pas mort)
Bon juillet c'est loin mais je vais m'occuper de cette source rapidement pour la mettre a jour et ensuite répondre à ta question. Faut que je replonge dans le source, merci a tous pour vos tests et vos contributions

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Question con? [ par SoyYo ] SalutJuste une question qui va peut etre vous paraitre un peu con!!En fait je fasi des recherches depuis quelques jours a propose d'un parseur HTML, e C#: meilleure façon de parser rapidement une page html [ par Karibot ] Bonjour, quelle est la meilleure façon de parser une page html et récupérer les liens qu'elle contient? j'utilise httpwebrequest pour parser la page e html agility [ par Karibot ] Bonjour, je cherche à récupérer tous les liens href d'une page html, je le fais actuellement en utilisant l'objet Regex, j'ai apris qu'on pouvait pars Application MVC - class="editor-field" et Html.EditorFor [ par artichomaske ] Bonjour, Je créer une application MVC qui doit permettre l'édition de valeurs dans des [i]editor-field[/i]. Une question bête à laquelle j'ai du mal [html]agilityPack [ par saratsdi ] [b][color=purple]Bonjour tout le monde, je travaille sur un projet ou j ai commencé à utiliser " html Agility pack " mon probleme c'est que je veux un menu horizontal pour ma page html, mais.............; [ par R1info ] Slt, S'il vous plait, je viens d'ajouter un menu horizontal dans ma page html. mais, ce que je veux moi, c'est: quand je suis dans une page de mon sit supprimer 1 ligne <tr> d'un tableau HTML avec un bouton C# [ par mimijesss ] Bonjour tout le monde, Je travaille actuellement sur le développement d'un formulaire en ligne à l'aide d'une Web Part C# avec le moteur WSS 3.0 sp2 e Comment remplir un formulaire d'une page html (Login et MDP) ? [ par miminooze ] Bonjour, Après quelques recherche sur internet, je cherche à remplir un formulaire d'une page html avec un webBrowser sous Visual Studio 2010, plus p Extraire des informations d'une page HTML [ par xmustapha ] bonjour voila, je cherche un moyen pour extraire des infos depuis cette page: http://www.google.com/finance/converter?a=15&from=ARS&to=AUD voici l


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,090 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales