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

EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
T'as raison au dodo !
bonne nuit
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Salut, t'as pu essayer le code ?

EN tout cas chez moi ça marche pas. Comme je te disais, quand je devrait entrer l'url, le curseur ne me laisse pas la main, et la fenêtre se ferme.
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Non DSl....
je vais tester demain soir....
Mais fais que je chope la libcurl pour windows, et l'installer.. ca prend "normalement" pas trop de temps mais po le temps ce soir...
@+
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Hé ! Chuka !

Quoi de neuf ??
Ca fais deux jours que tu m'as écris! Comme je voyais pas de message dans ma boite mail je pensais que tu m'avais oublié !

Je viens juste de comprendre à quoi sert le menu intervention sur la droite du site.
Je suis en train de décripter le code que tu m'envoies.

Dans celui qui précède j'avais remarqu' que comme la fonction utilise un pointeur qui par du debut du code de la page à analyser, il faudrait que je trouve autre chose.
Enfin, là ça devient vraiment génant pour moi, en fait, j'arrive plus à comprendre un code quand je le lie que quand j'essaie d'en concevoir un.

Bon, ben j'espère que ça va bien pour toi. @+
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Ho ! t'en fais pas.

Y'a des soirs ou il faut qu'on se concentre sur un truc particulier, ou au contraire qu'on se laisse vraiment aller.
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,

J'arrive pas à compiler avec libcurl sur windows....
T'as fais comment??(j'ai chopé .zip libcul mais la lib n'est pas reconnu apparement...)
J'ai recup libcurl.dll et je vais essayer de faire des ppointer de fonction avec cette DLL....je te tiens au jus!!
@+
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Salut,
essaye ce code:
#include <stdlib.h>

#include <curl/curl.h>

#include <stdio.h>

#include <string.h>
#include <windows.h>


typedef CURL* (*ptrcurlSession)();
typedef CURLcode (*ptrcurlSetop)(CURL *, CURLoption , void*);
typedef CURLcode (*ptrcurl_easy_perform)(CURL * handle );
typedef CURLcode (*ptrcurl_easy_cleanup)(CURL * handle );
ptrcurlSession curlSession;
ptrcurlSetop curlSetop;
ptrcurl_easy_perform ptrcurleasy_perform;
ptrcurl_easy_cleanup ptrcurleasy_cleanup;
/*

  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)

{      
	HINSTANCE hinst;
	hinst=LoadLibrary("libcurl.dll");
	if (hinst==NULL) printf("chargement DLL loope...");
	curlSession=(ptrcurlSession) GetProcAddress(hinst,"curl_easy_init");
	curlSetop=(ptrcurlSetop) GetProcAddress(hinst,"curl_easy_setopt");	
	ptrcurleasy_perform=(ptrcurl_easy_perform) GetProcAddress(hinst,"curl_easy_perform");
	ptrcurleasy_cleanup=(ptrcurl_easy_cleanup) GetProcAddress(hinst,"curl_easy_cleanup");
	CURL *session;

	CURLcode res;



	fichier[500000] = '\0';



	session = curlSession();

	curlSetop(session, CURLOPT_URL, url);

	curlSetop(session, CURLOPT_WRITEDATA, fichier);

	curlSetop(session, CURLOPT_WRITEFUNCTION, ecrire);

	ptrcurleasy_perform(session);

	ptrcurleasy_cleanup(session);
FreeLibrary(hinst);

}

/*

  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();
}

Telecharge libcurl.dll que tu mets dans le meme repertoire de compilation
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Entrer le debut
<a href="[http://]
Entrer la fin
"
Entrer l adresse du site qu il faut analyser...
www.commentcamarche.net
<a href="[http://] "
www.commentcamarche.net
droit-finances.commentcamarche.net
sante-medecine.commentcamarche.netë
en.kioskea.net/
es.kioskea.net/
www.commentcamarche.net
www.cim.be/mtwb/fr/r_10.html
www.commentcamarche.netÇ
en.kioskea.net&
es.kioskea.net
droit-finances.commentcamarche.netww.commentcamarche.net
sante-medecine.commentcamarche.net

c'est le resultat que j'obtiens.....
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Salut chuka ! alors on a les pieds dans l'eau ??
ici, je suis plutôt au sec.

je voulais savoir si je devais créer une boucle pour retenir ou afficher ( ? ) les sous liens contenus par le site d'une page web, où devrais l'insérer, dans la déclaration de fonction, ou dans la définition de fonction ?

C'est parce que je voudrais que mon programme me sorte tous les liens qu'il y a sur la page. mais je pense que jen'ai pas besoin de te montrer de quoi je parle ou alors veux tu que je te renvoi le programme ?
0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Salut!!
Normalement avec dernier code, t'as tout qui s'affiche!!
while (j!=499999) parcours tout le buffer de la recup de la page
Sinon, faut créer un tableau de char* dans la boucle, au choix!!
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
Salut Chuka !

j'ai un probleme. :(
Voilà ce que je n'arrive pas à faire :
Tu sais le programme que tu as fait pour isoler des sous chaine du code d'une page web ? ... et ben j'arrive pas à joindre tous les bouts que tu as fait.

EN fait faudrait que ça affiche :
1- la chaine de titre
2-la longue chaine des keywords
3-les multiples longue chaines d'adresse de lien de page web.

J'ai fait 3 fonction que j'ai essayé de modifier :


1- iso_chaine (char* data,char*sous_chaine ) pour le titre
2- iso_key (char* data,char*keywords ) pour les keywords
3- iso_lien (char* data,char*sous_lien ) pour les liens ( celle là j'arrive pas à la faire se répéter pour qu'elle prenne effectivement TOUS les liens et pas seulement le premier).

tu le connais par coeur mais le voici qd même , j'espère que t'as eu libcurl :

#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 LES KEYWORDS
*/
int iso_key (char* data,char*keywords )   
{    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!='\"')    
				{*keywords=*data;
				keywords++;
				i++;
				data++;
				if(*data=='\"')    
					break;
				}
			}
		}
	if((*data=='\"' )&& (i!=0))    
	break;
        j++;
	}	
return i;
}
/*
  FONCTION QUI SELECTIONNE LA SOUS CHAINE COMPRISE ENTRE LE BALISE <TITLE> ET <\TITLE>
*/
int iso_lien (char* data,char*sous_lien )  
{    int i; 
     char * debut = "<a href=\"http://";     
     while (i==0)
     {data++;   
     if(*data=='<')
		{if (strncmp(data,debut,16)==0)
			{data=data+16;
			while (*data!='\"')
				{*sous_lien=*data;
				sous_lien++;
				i++;
				data++;
				if(*data=='\"')
					break;
				}
			}
		}
	if((*data=='\"' )&& (i!=0))
	break;
	}	
return i;
}
/*
  PROGRAMME, QUI AU FINAL DOIS M'AFFICHER LA CHAINE DE CARACT7RE RECHERCHEE
*/
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;	
}

int main()
{   int i,u,v,k;
    char *source = (char*)malloc(500000*sizeof(char));
    char url[256];
    char sous_lien[12];
    char sous_chaine[255];
    char keywords[200];
    char nmemb;
    printf ("Entrer l adresse du site qu il faut analyser...\n");
    scanf("%s",url);

	dlwebsite(url, source);
    v=iso_chaine (source,sous_chaine);
	printf("%s\n", sous_chaine);
    k=iso_key (source,keywords);
       printf ("%s\n", keywords);
    i=iso_lien (source,sous_lien);
       printf("%s\n", sous_lien);
    
    scanf("%s",&u);
    getchar();
    getchar();
}

0
chuka Messages postés 965 Date d'inscription   Statut Membre Dernière intervention   378
 
Salut El Barto!!
Je pense le probleme vient du fait qu'a chaque fois que lance la boucle, il faut à la fin refaire pointer souce au debut du buffer:
int iso_key (char* data,char*keywords )   
{    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!='\"')    
				{*keywords=*data;
				keywords++;
				i++;
				data++;
				if(*data=='\"')    
					break;
				}
			}
		}
	if((*data=='\"' )&& (i!=0))    
	break;
        j++;
	}	
data=data-j;
return i;
}

Mais au lieu de faire 3 boucle essaye cela:
void iso_chaine (char* data,char*sous_chaine)  

{    int i; 
     int j=0;
     FILE*fp;
     char * debut = "<a href=\"http://"; 
     char*title="<title>";
     char*keywd="keywords\" content=\"";
     char*finTit="</title>";
     char*fin="\"";
     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;
					}

				}

			}
		 if (strncmp(data,title,strlen(title))==0)

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

			while (*data!=finTit[0])

				{
				*sous_chaine=*data;

				sous_chaine++;

				i++;

				data++;

				if(*data==finTit[0])

					{if (strncmp(data,finTit,strlen(finTit))==0)
						{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;
						}
					}

				}

			}
		
		}
	 if(*data==keywd[0])

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

			{data=data+strlen(keywd);
			 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);
}

Si tu veux pas recup les infos dans un fichier, supprime dans le code tout ce qui est fwrite FILE, fopen etc...
@+
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
SAlut !

En fait, je suis arrivé à faire marcher les trois fontion iso_lien; iso_chaine, et iso_titre ensembles.
Mon problème ça serait plutôt de récolter toute chaines de caractère contenu dans la page relative à iso_lien
(pour attraper toutes les adresse de liens contenu dans la page).
c'est donc plus un problème de faire recommencer la boucle à la fin du premier lien trouvé quoi.

et c'est là justement que je crois que cette méthode de pointeur qui commence de puis le début me paraît inadaptée en l'état.

Bon je cherche. à plus.
0
EL barto ! Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   6
 
JE viens d'essayer ta fcontion .

MON GARS ,YA OOOOOO !!!!!
C'est Nickel !

Ca marche! Ca va encore plus vite ! et ça à l'air de retrouver toutes les adresses. !

Bon il est une heure, bonne nuit. Et a plus !
0