PARSER HTML

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 9 janv. 2007 à 19:26
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 - 29 nov. 2010 à 17:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41034-parser-html

thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
29 nov. 2010 à 17:57
(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
juliensmarties Messages postés 16 Date d'inscription vendredi 8 août 2008 Statut Membre Dernière intervention 5 août 2010
20 juil. 2010 à 11:09
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:

[www.google.fr

Google c'est par là
]

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

Merci à ceux qui me viendrons en aide

Ju
Mathrb Messages postés 7 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 22 juin 2010
13 mars 2009 à 00:55
Merci
C'est ce que je cherchais
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
13 févr. 2009 à 12:58
Merci brlecler

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

A+
brlecler Messages postés 3 Date d'inscription lundi 13 septembre 2004 Statut Membre Dernière intervention 13 février 2009
13 févr. 2009 à 11:09
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:

BBBSSSSPSPSPDIDIDI

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...
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
22 août 2007 à 17:48
Merci Zeroc00l pour ces tests ! ceux sont effectivement des bugs !

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

A+
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
22 août 2007 à 03:05
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 !
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
22 août 2007 à 02:12
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 : "Blablabla"
Le Node qui correspond a " ... " a sa propriete "Value" à null et
le Node qui correspond a "" a sa propriete Value correspondant a "Blablabla".
Or si je ne m'abuse c'est le node "" qui devrait contenir "Blablabla" !

Avec le code suivant : ""Blablabla" 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
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
15 août 2007 à 10:07
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+
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
14 août 2007 à 18:17
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 :)
sorcer1 Messages postés 21 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 6 janvier 2009
26 mars 2007 à 11:20
"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!
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
12 févr. 2007 à 16:48
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
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
12 févr. 2007 à 03:25
Salut FremyCompany,

T'as plus d'infos sur le blog ou le projet ?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
11 févr. 2007 à 18:05
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...
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
10 janv. 2007 à 13:16
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)
cs_badrbadr Messages postés 475 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 3 novembre 2008 1
10 janv. 2007 à 12:27
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 :)
cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
9 janv. 2007 à 21:01
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.
thiosyiasar Messages postés 186 Date d'inscription lundi 11 mars 2002 Statut Membre Dernière intervention 30 novembre 2010 3
9 janv. 2007 à 19:45
effectivement...

ce code est ressorti d'une vielle valise!

une petite remise au propre s'impose...

merci pour tes remarques Bidou

(to be continued...)
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
9 janv. 2007 à 19:26
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é...
Rejoignez-nous