Un problème de logique ou de techinque ?

Résolu
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   -  
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'aurais besoin de conseil et d'aide, sur un programme que l'on m'a aidé à faire, mais qui ne marche pas et qui n'est pas satisfaisant du point de vue de la 'propreté du code'.

le but de ce programme est de récupérer dans le code source d'un page web, la chaine de caractère situé entre les balises <title> et <\title>.

le voici :

#include <windows.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <stdio.h>
#include <string.h>

/*
  FONCTION QUI ECRIS LE CODE SOURCE DE LA PAGE WEB DANS LA FENÊTRE DE COMMANDE
*/
size_t ecrire(void *ptr, size_t size, size_t nmemb, void *stream)
{
	sprintf(stream, "%s%s", stream, ptr);

	return nmemb;
}
/*
  FONCTION QUI TELECHARGE LE CODE SOURCE DE LA PAGE WEB
*/
void dlwebsite(char *url, char *fichier)
{
	CURL *session;
	CURLcode res;

	fichier[0] = '\0';

	session = curl_easy_init();
	curl_easy_setopt(session, CURLOPT_URL, url);
	curl_easy_setopt(session, CURLOPT_WRITEDATA, fichier);
	curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, ecrire);
	curl_easy_perform(session);
	curl_easy_cleanup(session);
}
/*
  FONCTION QUI SELECTIONNE LA SOUS CHAINE COMPRISE ENTRE LE BALISE <TITLE> ET <\TITLE>
*/

char iso_chaine (char source)  
{
     char chaine [500000];
     char sous_chaine;
     char * debut = "<title>";
     char * fin = "<\"title>";
     
     if ((sous_chaine > debut) && (sous_chaine<fin))
     
     return sous_chaine;
     
}

/*
  PROGRAMME, QUI AU FINAL DOIS M'AFFICHER LA CHAINE DE CARACT7RE RECHERCHEE
*/
int main()
{
	char *source = malloc(500000);
    char url[256];
    char sous_chaine;
    char nmemb;
    printf ("Entrer l adresse du site qu il faut analyser...\n");
    gets(url);
	dlwebsite(url, source);
	iso_chaine (sous_chaine);
    printf("%s", sous_chaine);
 
	system("pause");
}

30 réponses

chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Salut,
essaye cela et dis moi si ca marche....
#include <stdlib.h>

#include <curl/curl.h>

#include <stdio.h>

#include <string.h>



/*

  FONCTION QUI ECRIS LE CODE SOURCE DE LA PAGE WEB DANS LA FENÊTRE DE COMMANDE

*/

size_t ecrire(void *ptr, size_t size, size_t nmemb, void *stream)

{

	sprintf(stream, "%s%s", stream, ptr);



	return nmemb;

}

/*

  FONCTION QUI TELECHARGE LE CODE SOURCE DE LA PAGE WEB

*/

void dlwebsite(char *url, char *fichier)

{

	CURL *session;

	CURLcode res;



	fichier[500000] = '\0';



	session = curl_easy_init();

	curl_easy_setopt(session, CURLOPT_URL, url);

	curl_easy_setopt(session, CURLOPT_WRITEDATA, fichier);

	curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, ecrire);

	curl_easy_perform(session);

	curl_easy_cleanup(session);

}

/*

  FONCTION QUI SELECTIONNE LA SOUS CHAINE COMPRISE ENTRE LE BALISE <TITLE> ET <\TITLE>

*/



int iso_chaine (char* data,char*sous_chaine )  

{    int i=0; 

     char * debut = "<title>";

     char * fin = "<\title>";

     while (i==0)

     {data++;

     if(*data=='<')

		{if (strncmp(data,debut,7)==0)

			{data=data+7;

			while (*data!='<')

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data=='<')

					if (strncmp(data,fin,8)==0) 

						break;

				}

			}

		}

	if (strncmp(data,fin,8)==0) 

	break;

	}	

return i;	

    

}



/*

  PROGRAMME, QUI AU FINAL DOIS M'AFFICHER LA CHAINE DE CARACT7RE RECHERCHEE

*/

int main()

{   int i;

    char *source = (char*)malloc(500000*sizeof(char));

    char url[256];

    char sous_chaine[255];

    char nmemb;

    printf ("Entrer l adresse du site qu il faut analyser...\n");

    scanf("%s",url);

	dlwebsite(url, source);

	i=iso_chaine (source,sous_chaine);

	printf("%s\n", sous_chaine);

    getchar();

}


@+
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Ca marche.

bravo.

mais, apparement les caractères spéciaux ne sont pas reconnu ( tu sais "é" "è" etc ...).

hier je demandais si il n'existait pas un librairie de C# pour chercher cette commande, parce que ça me paraît gros que personne n'ai songer à en faire une pour résoudre ce type de probleme.

Qu'en penses tu ?
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Salut,

Si c'est sur windows (windows.h), dois y avoir une fonction pour cela je pense...faudrait fouiller du coté du msdn...

@+
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Salut chuka

Tu pourrais m'expliquer comment fonctione la fonction que tu m'a envoyée (la fonction "int iso_chaine (char* data,char*sous_chaine ) "

parce que j'essaie de la modifier pour l'utiliser afin de retrouver d'autres chaines de caractère comprise dans une page.

par exemple j'ai essayé sur des chaines comprise entre les balise script,
ou sur des des chaines comrpise entre les balise de liens ,...

pour faire cela j'ai cru comprendre qu'il fallait que 1 je modifie la declaration des balises, et 2 que j'adapte la longueur de ces balises dans la phase de recherche.

Mais est ce que j'ai bien fait ?

je te post un code ou par exemple je recherche les sous-chaine comprise entre les balises "<a href=\"" et "">".
tu remarquera que j'ai pris en compte le fait que ces balises utilise des caractère speciaux, et qu'ils ont pour longueur 9 et 2.

int iso_chaine (char* data,char*sous_chaine )  

{    int i=0; 

     char * debut = "<a href=\"";

     char * fin = "\">";

     while (i==0)

     {data++;

     if(*data=='<')

		{if (strncmp(data,debut,9)==0)

			{data=data+9;

			while (*data!='<')

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data=='<')

					if (strncmp(data,fin,2)==0) 

						break;

				}

			}

		}

	if (strncmp(data,fin,2)==0) 

	break;

	}	

return i;	
}



Le truc, c'est que la fenêtre de commande se lance, et qu'elle me demande l'adresse d'un site. Je la lui donne. on passe à la ligne suivante, où le programme semble chercher une seconde ou deux. Rien n'apparaît. Puis on passe à la troisième ligne ou je tape n'importe quel touche pour quitter le programme.

Il y aurait donc un pb au niveau de cette focntion. J'ai paensé au fait que dans une page source il y a souvent plusieurs lien, donc peut être ... mais comme ce n'est pas une boucle, ne devrait il pas m'afficher au moins le premier lien ?

Alors voilà. (puis y'a un truc etrange, c'est que parfois sur certaine sites par exemple je teste avec "www.nytimes.com", et bien au lieu de m'afficher le titre de la page, il m'affiche "Nytimes advertisment", je sais que certains journaux utilise une grande page de pub avant d'acceder au site, et cela alors même qu'on a tapé l'adresse du site directement dans la barre d'adresse. Mais pouquoi ?
0

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

Posez votre question
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Salut
int iso_chaine (char* data,char*sous_chaine )  

{    int i=0; 

     char * debut = "<a href=";

     while (i==0)

     {data++;

     if(*data=='<')

		{if (strncmp(data,debut,8)==0)

			{data=data+8;

			while (*data!='>')

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data=='>')

					break;

				}

			}

		}

	if((*data=='>' )&& (i!=0))

	break;

	}	

return i;	
}

J'ai pas testé mais ca devrait marcher.....
@+
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Salut !

merci d'avoir répondu aussi vite !
oui, ça marche. mais pour le coup je me rend compte que
1- les caractères spéciaux pose un problèmes ! ( en effet, à quoi sert de reconnaître le lien d'une adresse, si elle est inutilisable à cause des nombreux caractères spéciaux ?)
2- j'ai mal défini les contours des balises qui m'interesse ( autand "<a href=" fonctionne que la balise qui indique la fermeture du lien " ...."> " est mal reconnue par le programme.

j'ai bien cherché attentivement ce que tu as modifié , mais je n'ai pas trouvé autre chose que les constants fin et début. Est ce vraiment tout ce qu'il y avait à changé ? J'ai essayé de le faire mais ça ne fonctionnait pas.
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
non décidément j'ai essayé avec d'autre adresse.

ça ne fonctionne pas. le prog, n'affiche pas d'adresse.

est ce que ainsi ça ne marcherai pas mieux ?

int iso_chaine (char* data,char*sous_chaine )  

{    int i=0; 

     char * debut = "<a href=\"";

     while (i==0)

     {data++;

     if(*data=='<')

		{if (strncmp(data,debut,8)==0)

			{data=data+8;

			while (*data!="\">")

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data=="\">")

					break;

				}

			}

		}

	if((*data=="\">" )&& (i!=0))

	break;

	}	

return i;	
}


j'ai changé les '>' en "\">" ... mais qd je teste ça ouvre la fenêtre je rentre l'adresse, puis ça réfléchi et ça se ferme automatiquement .
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
salut:
ca marche chez moi....
./url_test
Entrer l adresse du site qu il faut analyser...
www.commentcamarche.net
"/rss/actualite.php3" class="rss"
correspond bien au premier a href, mais en effet c'est pas une adresse!!! faut faire une recherche sur les Http://
int iso_chaine (char* data,char*sous_chaine )  

{    int i=0; 
     char * debut = "<a href=\"http://";
     while (i==0)

     {data++;   

     if(*data=='<')

		{if (strncmp(data,debut,16)==0)

			{data=data+16;

			while (*data!='>')

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data=='>')

					break;

				}

			}

		}

	if((*data=='>' )&& (i!=0))

	break;

	}	

return i;	
}

ca me donne encore un bon resultat....
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
OK , non je crois que je viens de comprendre (je regardais au mauvais endroit dans la page source.
par contre j'ai absolument besoi de savoir comment tu indique (où dans le programme ) la "balise" de fin.
est ce
à ces niveaux :

while (*data!='>')
if(*data=='>')
if((*data=='>' )&& (i!=0))

?
si je souhaite éloigner ou rapprocher la longeur de la souchaine recherchée je dois donc remplacé '<' par 'autre chose' ?
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
j'ai vu que ça marchais pour les liens .

Mais je pige toujours pas. voilà que j'ai voulu l'adapter pour les balise meta keywords content et la fenêtre souvre, je rentre l'url pui j'atends une seconde que ça reflecisse mais la fenêtre d'erreure de windows me dit qu'il faut fermer.
pourtant voilà ce que j'ai fait :

int iso_chaine (char* data,char*sous_chaine )  

{    int i=0; 
     char * debut = "keywords\" content=\""; là j'ai remplacé par le début de chaine qui m'intéressait
     while (i==0)

     {data++;   

     if(*data=='k')  là j'ai remplacé > par k

		{if (strncmp(data,debut,21)==0)

			{data=data+21;

			while (*data!='\"')    là j'ai remplacé > par \"

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data=='\"')    là j'ai remplacé > par \"

					break;

				}

			}

		}

	if((*data=='\"' )&& (i!=0))     là j'ai remplacé > par \"

	break;

	}	

return i;
}


Qu'est ce que je fais mal ?
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
int iso_chaine (char* data,char*sous_chaine )  

{    int i=0; 
     int j;
     char * debut = "keywords\" content=\""; 
     while (j<500000)

     {data++;   

     if(*data=='k')  

		{if (strncmp(data,debut,19)==0)

			{data=data+19;

			while (*data!='\"')    

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data=='\"')    

					break;

				}

			}

		}

	if((*data=='\"' )&& (i!=0))    

	break;
        j++;
	}	

return i;
}

essaye comme cela...
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Non, là ça ne marche absolument pas.

aprés avoir validé l'url j'attends et y'a un drôle de signe qui apparaît.
en tout cas pas un caractère latin.

et puis je crois que le while j> 500 000
ça étouffe un peu sa réflection. il passe à la ligne suivante sans rien afficher .
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
#include <stdlib.h>

#include <curl/curl.h>

#include <stdio.h>

#include <string.h>



/*

  FONCTION QUI ECRIS LE CODE SOURCE DE LA PAGE WEB DANS LA FENÊTRE DE COMMANDE

*/

size_t ecrire(void *ptr, size_t size, size_t nmemb, void *stream)

{

	sprintf(stream, "%s%s", stream, ptr);



	return nmemb;

}

/*

  FONCTION QUI TELECHARGE LE CODE SOURCE DE LA PAGE WEB

*/

void dlwebsite(char *url, char *fichier)

{

	CURL *session;

	CURLcode res;



	fichier[500000] = '\0';



	session = curl_easy_init();

	curl_easy_setopt(session, CURLOPT_URL, url);

	curl_easy_setopt(session, CURLOPT_WRITEDATA, fichier);

	curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, ecrire);

	curl_easy_perform(session);

	curl_easy_cleanup(session);

}

/*

  FONCTION QUI SELECTIONNE LA SOUS CHAINE COMPRISE ENTRE LE BALISE <TITLE> ET <\TITLE>

*/

int iso_chaine (char* data,char*sous_chaine,char fin,char*debut )  

{    int i=0; 
     
     
     while (i==0)

     {data++;   

     if(*data==debut[0])

		{if (strncmp(data,debut,strlen(debut))==0)

			{data=data+strlen(debut);

			while (*data!=fin)

				{*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data==fin)

					break;

				}

			}

		}

	if((*data==fin )&& (i!=0))

	break;

	}	

return i;	
}



/*

  PROGRAMME, QUI AU FINAL DOIS M'AFFICHER LA CHAINE DE CARACT7RE RECHERCHEE

*/

int main(int arg,char* argv[])

{   int i;

    char *source = (char*)malloc(500000*sizeof(char));
 
    char url[256];

    char sous_chaine[255];
    char deb[255];
    char fin;

    char nmemb;
    printf ("Entrer le debut\n");
    gets(deb);
    printf ("Entrer la fin\n");
    scanf("%c",&fin);    
    printf ("Entrer l adresse du site qu il faut analyser...\n");
    scanf("%s",url);
    printf ("%s %c\n",deb,fin);
	dlwebsite(url, source);

	i=iso_chaine (source,sous_chaine,fin,deb);
	printf("%s\n", sous_chaine);

    getchar();
}

Je viens de tester cela...
Tu saisis ta chaine de debut, ton charactere de fin et le site
Si rien ne sort, c'est que y'a rien...
@+
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Non, ça ne marche pas.

C'est sympa d'avoir créer une interface, mais en fait j'en ai pas si besoin que ça tu sais.
Ce qui m'interesse c'est surtout de pouvoir repérer rapidement ce que je cherche.
non, j'aimerai vraiment que tu m'explique pourquoi le code pour reperer les keywords n'a pas marché.
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
En fait je ne cherche pas 1 seul truc à la fois. mais toujours le titre, les keyx words et les liens.

C'est pour ça que l'interface ne me sert pas beaucoup. Mais c'est gentil.
:)
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
C'est koi le site sur lequel tu fais la requete?
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
j'essaie
lemonde.fr
nytimes.com
lexpress.fr
lepoint.fr
commentcamarche.net
sfgate.com
latimes.com
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
pour le point j'ai ca:
Le Point, actualité internationale, High Tech, économie, actualité Française
avec ce code:
#include <stdlib.h>

#include <curl/curl.h>

#include <stdio.h>

#include <string.h>



/*

  FONCTION QUI ECRIS LE CODE SOURCE DE LA PAGE WEB DANS LA FENÊTRE DE COMMANDE

*/

size_t ecrire(void *ptr, size_t size, size_t nmemb, void *stream)

{

	sprintf(stream, "%s%s", stream, ptr);



	return nmemb;

}

/*

  FONCTION QUI TELECHARGE LE CODE SOURCE DE LA PAGE WEB

*/

void dlwebsite(char *url, char *fichier)

{

	CURL *session;

	CURLcode res;



	fichier[500000] = '\0';



	session = curl_easy_init();

	curl_easy_setopt(session, CURLOPT_URL, url);

	curl_easy_setopt(session, CURLOPT_WRITEDATA, fichier);

	curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, ecrire);

	curl_easy_perform(session);

	curl_easy_cleanup(session);

}

/*

  FONCTION QUI SELECTIONNE LA SOUS CHAINE COMPRISE ENTRE LE BALISE <TITLE> ET <\TITLE>

*/

void iso_chaine (char* data,char*sous_chaine,char fin,char*debut )  

{    int i; 
     int j=0;
     FILE*fp;
     fp=fopen("mytxt.txt","a+");
     
     while (j!=499999)

     {data++;   
     
     if(*data==debut[0])

		{if (strncmp(data,debut,strlen(debut))==0)

			{data=data+strlen(debut);
			 i=0;

			while (*data!=fin)

				{
				*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data==fin)

					{sous_chaine=sous_chaine-i;
					fwrite(sous_chaine,1,(i)*sizeof(char),fp);
					fwrite("\n",1,sizeof(char),fp);
                                        printf("%s\n",sous_chaine);
					sous_chaine=sous_chaine+i;
					break;
					}

				}

			}

		}

	j++;

	}	

fclose(fp);
}



/*

  PROGRAMME, QUI AU FINAL DOIS M'AFFICHER LA CHAINE DE CARACT7RE RECHERCHEE

*/

int main(int arg,char* argv[])

{   int i;

    char *source = (char*)malloc(500000*sizeof(char));
 
    char url[256];

    char sous_chaine[255];
    char deb[255];
    char fin;

    char nmemb;
    printf ("Entrer le debut\n");
    gets(deb);
    printf ("Entrer la fin\n");
    scanf("%c",&fin);    
    printf ("Entrer l adresse du site qu il faut analyser...\n");
    scanf("%s",url);
    printf ("%s %c\n",deb,fin);
	dlwebsite(url, source);

	iso_chaine (source,sous_chaine,fin,deb);
	//printf("%s\n", sous_chaine);

    getchar();
}






tu as le resultat dans le fichier text (mytext.txt)

0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
je ne peux pas rentrer l'URL.

je parviens à entrer les 2 premier paramètres, mais la fenêtre de commande ne me permet pas de saisir l'url. Le curseur clignote et ne tien pas compte des touches que je saisi sur le clavier.Puis la fenêtre se ferme.
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Je testerai demain...Le code fonctionne bien sur linux....j'ai pas testé sur windows...Mais normalement ca devrait marché aussi!!
Sur ce, je vais me coucher!!!!!
@+
0