Récuperer les infos d'une balise html [Résolu]

Messages postés
8
Date d'inscription
mardi 23 février 2010
Dernière intervention
1 avril 2010
- - Dernière réponse : Unlix
Messages postés
8
Date d'inscription
mardi 23 février 2010
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
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
8
Date d'inscription
mardi 23 février 2010
Dernière intervention
1 avril 2010
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Unlix
Messages postés
61
Date d'inscription
dimanche 5 novembre 2000
Dernière intervention
24 février 2010
0
Merci
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 ?
Commenter la réponse de rours
Messages postés
8
Date d'inscription
mardi 23 février 2010
Dernière intervention
1 avril 2010
0
Merci
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
Commenter la réponse de Unlix
Messages postés
61
Date d'inscription
dimanche 5 novembre 2000
Dernière intervention
24 février 2010
0
Merci
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é.
Commenter la réponse de rours
Messages postés
8
Date d'inscription
mardi 23 février 2010
Dernière intervention
1 avril 2010
0
Merci
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
Commenter la réponse de Unlix
Messages postés
61
Date d'inscription
dimanche 5 novembre 2000
Dernière intervention
24 février 2010
0
Merci
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.
Commenter la réponse de rours
Messages postés
14298
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
17 décembre 2018
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
61
Date d'inscription
dimanche 5 novembre 2000
Dernière intervention
24 février 2010
0
Merci
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 :)
Commenter la réponse de rours
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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é. -
Commenter la réponse de krimog
Messages postés
61
Date d'inscription
dimanche 5 novembre 2000
Dernière intervention
24 février 2010
0
Merci
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.
Commenter la réponse de rours
Messages postés
8
Date d'inscription
mardi 23 février 2010
Dernière intervention
1 avril 2010
0
Merci
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
Commenter la réponse de Unlix
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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é. -
Commenter la réponse de krimog
Messages postés
8
Date d'inscription
mardi 23 février 2010
Dernière intervention
1 avril 2010
0
Merci
Et je peux récupérer ce qui se trouve dans * facilement?
Commenter la réponse de Unlix
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
ç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é. -
Commenter la réponse de krimog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.