Récuperer les infos d'une balise html

Résolu
Unlix Messages postés 8 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 1 avril 2010 - 23 févr. 2010 à 16:10
Unlix Messages postés 8 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 1 avril 2010 - 24 févr. 2010 à 17:08
Bonjour,

Je souhaite pouvoir récupérer les informations d'une balise html en c#.

Exemple:
Dans le code html j'ai:
[... ]
je souhaite pouvoir récupérer ce qui se trouve dans les "" sur tous les "href" de mon fichier html.

J'aimerai pouvoir le faire pour d'autre balise.

Travaillant depuis peu en c# j'ai un peu de mal, pouvez vous m'aider?

Merci d'avance,
Unlix

14 réponses

Unlix Messages postés 8 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 1 avril 2010
24 févr. 2010 à 17:08
J'ai trouvé ma solution, la voici:

string[] lines =  File.ReadAllLines(shtml, Encoding.Default);
foreach (string line in lines)
{
    Match m = Regex.Match(line, "href="(.+?)"");
    string s = m.Groups[1].ToString();
}


Match m = Regex.Match(line, "href="(.+?)"");
// Je recherche dans la line si j'ai une chaîne href ="..."
// Je stocke la chaîne complète href="..." dans m.Groups[0]
// Je stocke grâce à (.+?) la chaîne se trouvant entre les " dans m.Groups[1]

string s = m.Groups[1].ToString();
// Je récupère donc la valeurs de m.Group[1] dans mon string m

J'espère être clair.

En tout cas merci à vous tous de m'avoir aidé pour arriver à trouver la solution qui me convient.

++
Unlix
3
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010
23 févr. 2010 à 16:30
Salut,

En fait tu as un fichier html, et tu veux que ton appli C# ouvre le fichier et te ressorte toute les @ des href, c'est bien ça ?
0
Unlix Messages postés 8 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 1 avril 2010
23 févr. 2010 à 16:45
Oui toute à fait, genre dans mon appli c# je récupère ce que j'ai entre "" dans une liste de string que je pourrais exploiter dans la suite de l'appli.

Et je veux pouvoir faire la même chose pour d'autre balise comme par exemple les "signet"

Unlix
0
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010
23 févr. 2010 à 17:00
En fait, l'idéal pour parcourir un fichier avec des balises est quand il sagit un Xml. il y a beaucoup de fonctions qui permettent de parcourir les fichiers xml. Comme tu n'as pas un fichier Xml (et que je ne pense pas qu'il soit possible de réaliser des traitements similaire pour un fichier html), une solution consiste à considérer ton fichier comme un fichier texte.
Tu ouvres ton fichier, tu le parcours lignes par ligne par exemple (sauf si certaine @ tiennent sur plusieurs lignes), puis tu parcours les mots (pour ça il y a plusieurs possibilités) et lorsque tu trouves un "href" tu récupères l'@ (le mot suivant en gros).

Si tu pars sur cette solution, il faut que tu mattes sur google des tuto de c# sur la lecture de fichier texte, mais ça n'est pas très compliqué.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Unlix Messages postés 8 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 1 avril 2010
23 févr. 2010 à 17:23
En faisant ça:

[i]string[] lines = File.ReadAllLines(shtml, Encoding.Default);
foreach (string line in lines)
{
int iPosFind = line.IndexOf("<a href=");
}/i

j'arrive à pointer sur la ligne où il y a un "href" mais après comment je fais pour récupérer la suite de la "string" qui se trouve entre ""?

Unlix
0
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010
23 févr. 2010 à 17:35
Je pense qu'il faut que tu utilises substring ou bien split, pour découper ta chaine (ta ligne).

Par exemple, tu choppes la string après le (<a href="). puis tu fais un split sur le caractère ".
split va te retourner un tableau de string découper selon le caractère donné. Enfin c'est un peu de la magouille et faut bien voir si il n'y a pas des lignes qui vont être problématiques mais ça marchera.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
23 févr. 2010 à 17:40
Hello,
Tu peux continuer avec IndexOf(""",iPosFind); (syntaxe à vérifier)

@rours: un fichier HTML est un fichier XML, non?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010
23 févr. 2010 à 17:50
pour buno. Bien que très proche, je ne sais pas si en C# il est possible de faire les mêmes traitements, car il y a quelques différences : http://xml.chez.com/initiation/ Tout dépend de la façon dont il considère quand un fichier est un fichier XML ou non. Il suffit de tester au pire :)
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
24 févr. 2010 à 10:03
Salut

Tout d'abord, attention avec
line.IndexOf("[); 

Ta balise peut parfaitement être
<a title= Texte]

Auquel cas ton code la zappera.

Alors, le HTML de base est-il du XML ? Non
Le XHTML, quant à lui, en est.
Cependant, fait le W3C Validator te prouvera que peu de sites sont réellement en XHTML.
Un exemple très classique d'erreur par rapport au XML :


img est une balise vide, mais elle n'est pas fermée dans l'exemple. Correction :



Or les bibliothèques C# de traitement XML sont, dans mes souvenirs, très strictes. La moindre erreur dans le XML génère une exception.

Si tu veux gagner en performances, par rapport à ta technique (mais pas forcément en rapidité), intéresse-toi aux expressions régulières.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
rours Messages postés 61 Date d'inscription dimanche 5 novembre 2000 Statut Membre Dernière intervention 24 février 2010
24 févr. 2010 à 11:46
Comme j'ai essayé de l'expliquer plus haut, Même si ce n'est pas ce qu'il y a de plus propre, découper ta chaine de caractère (une ligne) en prenant la partie après le " href=" avec un split par exemple), puis de prendre tout jusqu'au prochain ". Il y a peu de cas qui devraient être problématiques.
0
Unlix Messages postés 8 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 1 avril 2010
24 févr. 2010 à 11:51
Bonjour à vous,

Premièrement, merci pour vos réponse.

Deuxièmement, voici ce que j'ai fait:
[i]int iPosFind = line.IndexOf("href=");
if (iPosFind >= 0)
{
int iPosStart = iPosFind + 6;
int iPosEnd = line.IndexOf(""", iPosStart);
string sFileName = line.Substring(iPosStart, iPosEnd - iPosStart);
}/i

Qu'est-ce que vous en pensez? j'ai l'impression que c'est pas propre ^^.

Merci ++,
Unlix
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
24 févr. 2010 à 11:55
Oulà, je me corrige :

Si tu veux gagner en performances, par rapport à ta technique (mais pas forcément en rapidité), intéresse-toi aux expressions régulières.

Si tu veux gagner en performances, par rapport à ta technique (mais pas forcément en simplicité), intéresse-toi aux expressions régulières.

Ça marchera très vite. Car les expressions régulières, c'est vraiment fait exactement pour ça : la recherche de certains patterns dans une chaine de caractères (en l'occurrence, la recherche du pattern href="*" (et en fait, ce sera simple d'utiliser les expressions régulières dans ton cas, car le pattern est très simple).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
Unlix Messages postés 8 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 1 avril 2010
24 févr. 2010 à 12:02
Et je peux récupérer ce qui se trouve dans * facilement?
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
24 févr. 2010 à 12:19
ça donne un truc du genre :

Regex recherche = new Regex("href="*"", RegexOptions.Compiled | RegexOptions.IgnoreCase);

foreach(Match hrefTrouve in recherche.Matches(line)) 
{
    string adresse = hrefTrouve.Value.SubString(6, hrefTrouve.Value.Length - 7);
}


Il doit y avoir une autre solution pour prendre directement la valeur de *, mais je n'ai pas trop regardé.

PS : je ne garantis pas que le code fonctionne parfaitement, je ne peut pas le tester ici.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
Rejoignez-nous