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

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

14 réponses

Répondre au sujet
Unlix 8 Messages postés mardi 23 février 2010Date d'inscription 1 avril 2010 Dernière intervention - 24 févr. 2010 à 17:08
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Unlix
rours 61 Messages postés dimanche 5 novembre 2000Date d'inscription 24 février 2010 Dernière intervention - 23 févr. 2010 à 16:30
0
Utile
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
Unlix 8 Messages postés mardi 23 février 2010Date d'inscription 1 avril 2010 Dernière intervention - 23 févr. 2010 à 16:45
0
Utile
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
rours 61 Messages postés dimanche 5 novembre 2000Date d'inscription 24 février 2010 Dernière intervention - 23 févr. 2010 à 17:00
0
Utile
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
Unlix 8 Messages postés mardi 23 février 2010Date d'inscription 1 avril 2010 Dernière intervention - 23 févr. 2010 à 17:23
0
Utile
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
rours 61 Messages postés dimanche 5 novembre 2000Date d'inscription 24 février 2010 Dernière intervention - 23 févr. 2010 à 17:35
0
Utile
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
BunoCS 13764 Messages postés lundi 11 juillet 2005Date d'inscription 20 avril 2018 Dernière intervention - 23 févr. 2010 à 17:40
0
Utile
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
rours 61 Messages postés dimanche 5 novembre 2000Date d'inscription 24 février 2010 Dernière intervention - 23 févr. 2010 à 17:50
0
Utile
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
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 24 févr. 2010 à 10:03
0
Utile
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
rours 61 Messages postés dimanche 5 novembre 2000Date d'inscription 24 février 2010 Dernière intervention - 24 févr. 2010 à 11:46
0
Utile
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
Unlix 8 Messages postés mardi 23 février 2010Date d'inscription 1 avril 2010 Dernière intervention - 24 févr. 2010 à 11:51
0
Utile
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
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 24 févr. 2010 à 11:55
0
Utile
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
Unlix 8 Messages postés mardi 23 février 2010Date d'inscription 1 avril 2010 Dernière intervention - 24 févr. 2010 à 12:02
0
Utile
Et je peux récupérer ce qui se trouve dans * facilement?
Commenter la réponse de Unlix
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 24 févr. 2010 à 12:19
0
Utile
ç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.