Décortiquer la source d'une page HTML pour en extraire les infos

Résolu
Signaler
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007
-
Messages postés
66
Date d'inscription
lundi 27 juin 2005
Statut
Membre
Dernière intervention
2 juin 2006
-
Bonjour,


Voilà, j'utilise Visual Studio C# 2005 Express (Donc Frameworks 2.0), et je suis en train de faire une petite application qui devrai prendre la source d'une page web, et trouver quelques infos dedans.


Exemple concret (c'est ce que je veux faire) : sur http://quotes.ubs.com/quotes/language=F, il y a un tableau contenant des valeurs, et je souhaiterai afficher un condensé de ces infos, c'est à dire extraire les infos en rouge dans la source suivante :

---------------------------------------------
(début)...
Name,
Close,
Low,
High,
Last,
Chg. %,

----

SMI,
8'017.96,
8'035.45,
8'090.19,
8'047.12,
+0.36,

----

DJ Industr Avg Indx,
11'253.24,
11'254.12,
11'290.07,
11'279.65,
+0.23,

----

FTSE 100,
5'999.4,
,
,

...(fin)
---------------------------------------------

Voilà, il faudrai que je puisse isoler les chiffres en rouge de ce paquet de texte. Les chiffre en rouge et en bleu changeront chaque jour, mais le reste du code ne changera pas.

Si vous avez une idée, elle sera la bienvenue, car franchement je n'ai pas la moindre idée de la manière de procéder.

Merci beaucoup d'avance,

Siteauludo

4 réponses

Messages postés
66
Date d'inscription
lundi 27 juin 2005
Statut
Membre
Dernière intervention
2 juin 2006
1
//lire page
try
{
int k=0;
string[] split = null;
// Création d'une instance de StreamReader pour permettre la lecture de notre fichier
StreamReader monStreamReader = new StreamReader(@"C:\cheminfichier\page.html");
string ligne = monStreamReader.ReadLine();

// Lecture de toutes les lignes et affichage de chacune sur la page
while (ligne != null)
{
if (ligne.Length > 60) //demande une ligne plus longue que 60 caractères
{
ligne = ligne.Substring(46, 13);
string result = "";
string delimStr = "<>";
char[] delimiter = delimStr.ToCharArray();

if (ligne.Substring(0, 1) == ">") //vérifie que le premier élement de la ligne (index 46) soit >
{
split = ligne.Split(delimiter, 3); //coupe sur les delimiter en max 3 parties
ligne = split[1]; //récupère la partie numéro 2 (index 1)

try
{
int.Parse(ligne.Substring(0, 1)); //vérifie que ca soit un nombre sinon bang :p
result = ligne;
k++;

if (k == 4) { label1.Text += result; k = 0; }
} catch { label2.Text +"bang"; k 0; }
}
else
{
k = 0;
}
}
ligne = monStreamReader.ReadLine();
}
// Fermeture du StreamReader (attention très important)
monStreamReader.Close();
}
catch (Exception ex)
{
// Code exécuté en cas d'exception
label2.Text = "Une erreur est survenue au cours de la lecture !";
//label2.Text = ex.Message;
}

Voila, à ne pas changer: la longueur de la ligne avant le nombre à récupérer et les signes <> aisi que l'ordre (4).
En rouge le label des erreurs, en mauve, celui ou je récupère les nombres souhaités
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Gyzmo, quand tu utilises un try/catch si un objet nécessite l'appel d'une fonction Close ou Dispose utilises un try/catch/finally, ou une close using.

SreamReader sr = null;

try
{
// ..
}
catch
{
// ..
}
finally
{
if ( sr != null )
{
sr.close( );
sr = null;
}
}
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007

Cher Gizmo, quelle perfection, quelle rapidité, quel style !!!

Merci beaucoup !
Siteauludo
Messages postés
66
Date d'inscription
lundi 27 juin 2005
Statut
Membre
Dernière intervention
2 juin 2006
1
Jamais prétendu que mon code était optimisé, il est meme brouillon mais il fonctionne... C'est un coup de main, je n'ai pas la pretention de faire le boulo des autres à leur place. Effectivement, un finally l'optimiserait d'avantage et comme ressources non managés, il serait mieux de mettre un close pour libérer l'espace mémoire