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 -
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 :
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"); }
A voir également:
- Un problème de logique ou de techinque ?
- Et logique excel - Guide
- Lecteur logique ✓ - Forum Windows
- Afpa tests niveau 3 d'entrée en formation : français, maths, logique - Forum Études / Formation High-Tech
- Tableau analyse logique pdf - Guide
- Simulateur logique combinatoire en ligne - Télécharger - Vie quotidienne
30 réponses
Salut,
essaye cela et dis moi si ca marche....
@+
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(); }
@+
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 ?
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 ?
Salut,
Si c'est sur windows (windows.h), dois y avoir une fonction pour cela je pense...faudrait fouiller du coté du msdn...
@+
Si c'est sur windows (windows.h), dois y avoir une fonction pour cela je pense...faudrait fouiller du coté du msdn...
@+
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.
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 ?
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut
J'ai pas testé mais ca devrait marcher.....
@+
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.....
@+
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.
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.
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 ?
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 .
ç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 .
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://
ca me donne encore un bon resultat....
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....
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' ?
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' ?
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 :
Qu'est ce que je fais mal ?
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 ?
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...
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 .
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 .
#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...
@+
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é.
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é.
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.
:)
C'est pour ça que l'interface ne me sert pas beaucoup. Mais c'est gentil.
:)
pour le point j'ai ca:
Le Point, actualité internationale, High Tech, économie, actualité Française
avec ce code:
tu as le resultat dans le fichier text (mytext.txt)
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)