Un prog pour lire la source d'une page web ?
Résolu
EL barto !
Messages postés
121
Date d'inscription
Statut
Membre
Dernière intervention
-
TRANOX -
TRANOX -
A voir également:
- Un prog pour lire la source d'une page web ?
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Supprimer une page word - Guide
- Lire un fichier epub - Guide
- Web office - Guide
- Comment traduire une page web - Guide
33 réponses
Salut,
=> http://www.commentcamarche.net/faq/sujet 8241 telecharger le contenu d une page web distante
=> http://www.commentcamarche.net/faq/sujet 8241 telecharger le contenu d une page web distante
super merci, mais
on est vraiment obligé de telecharger la page, on ne peut pas tout simplement la lire ( il n'existe pas une fonction / programme / commande qui permette de faire uniquement cela .
Autre question, d'aprés ce que je lis sur la description de l'utilisation de la fonction curl, il faut entrer manuellement la fonction à utiliser pour le telechargement, c'est donc qu'on pourrait peut être en mettre une autre qui serve à la lecture de la page source non ??
on est vraiment obligé de telecharger la page, on ne peut pas tout simplement la lire ( il n'existe pas une fonction / programme / commande qui permette de faire uniquement cela .
Autre question, d'aprés ce que je lis sur la description de l'utilisation de la fonction curl, il faut entrer manuellement la fonction à utiliser pour le telechargement, c'est donc qu'on pourrait peut être en mettre une autre qui serve à la lecture de la page source non ??
Salut killian,
je reviens sur notre échange parce que je n'arrive pas à utiliser la fonction fwrite. je ne sais pas comment on fait, j'ai beau chercher dans les bibliothèques... bref.
Est ce que tu pourrais, toi, m'indiquer comment faire pour lire le code source d'une page web, afin d'en selectionner certain passage.
(l'aspect "selection" de mon projet est déjà réalisé, mais si je ne lis pas cette foutu page, je n'y arriverai jamais .
merci à toi, en tout cas encore une fois.
je reviens sur notre échange parce que je n'arrive pas à utiliser la fonction fwrite. je ne sais pas comment on fait, j'ai beau chercher dans les bibliothèques... bref.
Est ce que tu pourrais, toi, m'indiquer comment faire pour lire le code source d'une page web, afin d'en selectionner certain passage.
(l'aspect "selection" de mon projet est déjà réalisé, mais si je ne lis pas cette foutu page, je n'y arriverai jamais .
merci à toi, en tout cas encore une fois.
Ok, voici une petite fonction fwrite qui, au lieu d'enregistrer dans un fichier, enregistre dans un buffer.
Je n'ai pas testé mais tu me diras ce que ça donne:
Note que realloc se comporte comme malloc si buffer = NULL.
C'est pas très optimisé d'utiliser realloc mais bon j'avais pas envie de me prendre la tête.
A la fin dans offset, tu as la taille de ton buffer.
N'oublie pas de faire un free dessus quand tu n'en as plus besoin.
Je n'ai pas testé mais tu me diras ce que ça donne:
char *buffer = NULL; int offset = 0; size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { int i; buffer = (char *) realloc(buffer, size * nmemb); for (i=0; i < size * nmemb; i++) { buffer[i + offset] = ptr[i]; offset++; } return size * nmemb; }
Note que realloc se comporte comme malloc si buffer = NULL.
C'est pas très optimisé d'utiliser realloc mais bon j'avais pas envie de me prendre la tête.
A la fin dans offset, tu as la taille de ton buffer.
N'oublie pas de faire un free dessus quand tu n'en as plus besoin.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
salut, encore,
ben j'ais pas faire, j'y arrive pas.
je comprends pas.
Je comprend pas comment on peut faire appel à une fonction en tant qu'argument d'un autre fonction).
Ou est ce que je defini la fonction à quel niveau ?
et puis où exactement je fait appel à elle ?
ensuite, pour être certain qu'il l'a lu, faudrait que j'affiche le résultat dans la fenêtre d'exectution, mais quel est alors la variable qu'il faut appelé.
bon ben je t'envoie ça. parce que ... là je suis à bout.
ben j'ais pas faire, j'y arrive pas.
je comprends pas.
Je comprend pas comment on peut faire appel à une fonction en tant qu'argument d'un autre fonction).
Ou est ce que je defini la fonction à quel niveau ?
et puis où exactement je fait appel à elle ?
ensuite, pour être certain qu'il l'a lu, faudrait que j'affiche le résultat dans la fenêtre d'exectution, mais quel est alors la variable qu'il faut appelé.
bon ben je t'envoie ça. parce que ... là je suis à bout.
#include <windows.h> #include <stdlib.h> #include <curl/curl.h> #include <stdio.h> int main(int argc, char **argv) { /*********************Quest ce que je dois enlever et modifier ?***********************/ char *buffer = NULL; int offset = 0; CURL *session = curl_easy_init(); /*Initialisation de la session */ curl_easy_setopt(session, size_t buffer_write, "sfgate.com"); /*On précise l'url qui nous interesse */ curl_easy_setopt(session, CURLOPT_WRITEDATA, fp); /*On balance notre pointeur de fichier comme destination */ curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, fwrite);/*On précise la fonction qui gèrera l'écriture dans notre fichier. Peut être n'êtes vous pas habitués à celà, il faut mettre un pointeur de fonction en paramètre de curl_easy_setopt. Comme ça curl_easy_setopt utilisera cette fonction pointée pour écrire dans le fichier. La fonction en question doit respecter la même en-tête que la fonction standard fwrite:*/ curl_easy_perform(session); fclose(fp); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ return 0; /*********************où est ce que ça se met ?***********************/ size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { int i; buffer = (char *) realloc(buffer, size * nmemb); for (i=0; i < size * nmemb; i++) { buffer[i + offset] = ptr[i]; offset++; } return size * nmemb; }
tiens, je pense que j'ai viré deux ou trois trucs qui servaient pas ( autant dire que j'ai arraché des trucs sans savoir ce que c'est sous le capot d'une voiture !! :)
j'ai parsemé d'indice 1 2 3 4 ... le programme. et résultat même pas le 1 s'affiche. Ensuite y'a cette fontion :
que je comprend pas. quest ce que c'est CURLOPT_WRITEFUNCTION ? la description raconte que c'est pour résoudre un problème de language, mais elle dit aussi que c'est pour spécifier la façon dont le ficheir sera écrit.
mais je ne veux pas de fichier, je veux juste que en tapant une url, ça mécrivent le contenu de la page source en dessous. est ce que cette fonction est utile ?
j'ai parsemé d'indice 1 2 3 4 ... le programme. et résultat même pas le 1 s'affiche. Ensuite y'a cette fontion :
curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, fwrite);
que je comprend pas. quest ce que c'est CURLOPT_WRITEFUNCTION ? la description raconte que c'est pour résoudre un problème de language, mais elle dit aussi que c'est pour spécifier la façon dont le ficheir sera écrit.
mais je ne veux pas de fichier, je veux juste que en tapant une url, ça mécrivent le contenu de la page source en dessous. est ce que cette fonction est utile ?
#include <windows.h> #include <stdlib.h> #include <curl/curl.h> #include <stdio.h> int main(int argc, char **argv) { char url; scanf ("%c", &url) printf ("1"); size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { int i; buffer = (char *) realloc(buffer, size * nmemb); for (i=0; i < size * nmemb; i++) { buffer[i + offset] = ptr[i]; offset++; } return size * nmemb; } /*********************Quest ce que je dois enlever et modifier ?***********************/ char *buffer = NULL; int offset = 0; printf("2"); CURL *session = curl_easy_init(); /*Initialisation de la session */ curl_easy_setopt(session, size_t buffer_write, &url); /*On précise l'url qui nous interesse, mais j'essai de la mettre au travers de la variable &url, est ce la bonne méthode ?*/ curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, fwrite); printf ("3"); fclose(fp); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ printf ("4"); return 0; }
Mouais, évite de déclarer des fonctions dans des fonctions:
CURLOPT_WRITEFUNCTION est la fonction que curl doit utiliser pour enregistrer les données. Donc au lieu de fwrite, on met la nôtre.
#include <windows.h> #include <stdlib.h> #include <curl/curl.h> #include <stdio.h> char *buffer = NULL; int offset = 0; size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { int i; buffer = (char *) realloc(buffer, size * nmemb); for (i=0; i < size * nmemb; i++) { buffer[i + offset] = ptr[i]; offset++; } return size * nmemb; } int main(int argc, char **argv) { char url[1024]; scanf ("%s", url) CURL *session = curl_easy_init(); /*Initialisation de la session */ curl_easy_setopt(session, CURLOPT_URL, url); curl_easy_setopt(session, CURLOPT_WRITEDATA, NULL); //On fait semblant d'avoir un fichier curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction curl_easy_perform(session); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ return 0; }
CURLOPT_WRITEFUNCTION est la fonction que curl doit utiliser pour enregistrer les données. Donc au lieu de fwrite, on met la nôtre.
non, toujours pas, je crois pas qu'il marche je suis cessé ecrire une url lors du déroulement du programme, et il ne le demande pas. je crois qu'il n'execute que la moitierdu programme, ou alors rien du tout.
Hum,
non, cette fonction est déjà dans le code. c'est pour ça que pense pluôt que ça ne marche pas ailleurs.
merci
non, cette fonction est déjà dans le code. c'est pour ça que pense pluôt que ça ne marche pas ailleurs.
merci
la fenêtre d'execution s'ouvre, puis le curseur clignote ( une seule fois), et ça se ferme.
un doublon?
un doublon? c'est une discussion, de toute manière des question j'en ai plein, et pas qu'a ce sujet, mais comme je vois une connaissance , il est normal que lui demande aussi non ?
... même pour des commande simple comme (printf "1") que je met dés le départ ça n'affiche rien. La fontion que tu m'as filé, fonctionne peut être, mais ça n'arrive pas jusqu'à ce niveau.
un doublon?
un doublon? c'est une discussion, de toute manière des question j'en ai plein, et pas qu'a ce sujet, mais comme je vois une connaissance , il est normal que lui demande aussi non ?
... même pour des commande simple comme (printf "1") que je met dés le départ ça n'affiche rien. La fontion que tu m'as filé, fonctionne peut être, mais ça n'arrive pas jusqu'à ce niveau.
Ok j'ai pigé, alors je passe cette discussion en mode résolu et tu nous rejoins la nouvelle discussion ? ( parce que là la page commence à être longue).
J'ai recopié texto ton programme, et il semble que le compilateur bloque à ce niveau :
Il décrit : 'in function buffer_write'
Et je ne peux rien entrer ( j'ai retiré scanf pamerce qu'au font pour l'instant il vaut mieux vérifier si d'une manière globale ça marche avant de pouvoir entrer manuellement un URL lors de l'execution, ça ça me parâit être de l'accessoire), mais comme je disais ce qu'il y a de surprenant c'est que si je parsème le programme de printf ("1, 2, 3") l'execution n'affiche rien, ce qui montre que c'est dès le départ qu'il y a un problème.
J'ai recopié texto ton programme, et il semble que le compilateur bloque à ce niveau :
buffer[i + offset] = ptr[i];
Il décrit : 'in function buffer_write'
Et je ne peux rien entrer ( j'ai retiré scanf pamerce qu'au font pour l'instant il vaut mieux vérifier si d'une manière globale ça marche avant de pouvoir entrer manuellement un URL lors de l'execution, ça ça me parâit être de l'accessoire), mais comme je disais ce qu'il y a de surprenant c'est que si je parsème le programme de printf ("1, 2, 3") l'execution n'affiche rien, ce qui montre que c'est dès le départ qu'il y a un problème.
Pour bien comprendre ce qui s'est passé, c'est que au départ mon problème était d'ouvrir une séssion pour capter une page web.
Kilian m'a montré le topo sur la fonction curl.
https://www.commentcamarche.net/list 8241 telecharger le contenu d une page web distante
L'ennui, c'est que dans ce topo, on utilise curl pour télécharger la page.
Or moi, je ne dois pas la télécharger je ne dois me contenter que de la lire, et eventuellement , pour montrer que j'arrive à la lire, la faire afficher le code source dans la fenêtre d'execution, mais rien de plus. je vous passe la fonction telle qu'elle est dans l'état actuel et à la l'heure de la dernière modification .
la voici :
Kilian m'a montré le topo sur la fonction curl.
https://www.commentcamarche.net/list 8241 telecharger le contenu d une page web distante
L'ennui, c'est que dans ce topo, on utilise curl pour télécharger la page.
Or moi, je ne dois pas la télécharger je ne dois me contenter que de la lire, et eventuellement , pour montrer que j'arrive à la lire, la faire afficher le code source dans la fenêtre d'execution, mais rien de plus. je vous passe la fonction telle qu'elle est dans l'état actuel et à la l'heure de la dernière modification .
la voici :
#include <windows.h> #include <stdlib.h> #include <curl/curl.h> #include <stdio.h> int main(int argc, char **argv) /*là c'est la définition de la fontion buffer_write pour allouer la bonne taille au buffer*/ size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { char *buffer = NULL; int offset = 0; int i; char *myptr = (char *) ptr; buffer = (char *) realloc(buffer, size * nmemb); for (i=0; i < size * nmemb; i++) { buffer[i + offset] = myptr[i]; offset++; } return size * nmemb; } /*là c'est l'ouverture de la séssion vers l'url, et la lecture grâce à la fonction buffer_write*/ { CURL *session = curl_easy_init(); /*Initialisation de la session */ curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */ curl_easy_setopt(session, CURLOPT_WRITEDATA, NULL); //On fait semblant d'avoir un fichier curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction curl_easy_perform(session); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ return 0; }
Tu ne m'as pas dis si ça changeait quelque chose avec les derniers changements.
Je me demande au final si tu jne considère pas le fait que la fenêtre se ferme à la fin de l'application comme si c'était un bug.
Mets voir ceci juste avant le return 0 du main:
Et dit moi ce que ça donne. La fenêtre devrait rester en place tant que tu n'as pas tapé un caractère à la fin + entrée.
Autre chose: je ne sais pas ce que tu as fait avec le code, mais la fonction main a volé.
Forcément ça risque pas de marcher.....
Teste ça et dis moi ce que ça donne.
Je me demande au final si tu jne considère pas le fait que la fenêtre se ferme à la fin de l'application comme si c'était un bug.
Mets voir ceci juste avant le return 0 du main:
getchar();
Et dit moi ce que ça donne. La fenêtre devrait rester en place tant que tu n'as pas tapé un caractère à la fin + entrée.
Autre chose: je ne sais pas ce que tu as fait avec le code, mais la fonction main a volé.
Forcément ça risque pas de marcher.....
#include <windows.h> #include <stdlib.h> #include <curl/curl.h> #include <stdio.h> /*là c'est la définition de la fontion buffer_write pour allouer la bonne taille au buffer*/ size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { char *buffer = NULL; int offset = 0; int i; char *myptr = (char *) ptr; buffer = (char *) realloc(buffer, size * nmemb); for (i=0; i < size * nmemb; i++) { buffer[i + offset] = myptr[i]; offset++; } return size * nmemb; } /*là c'est l'ouverture de la séssion vers l'url, et la lecture grâce à la fonction buffer_write*/ int main(int argc, char **argv) { CURL *session = curl_easy_init(); /*Initialisation de la session */ curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */ curl_easy_setopt(session, CURLOPT_WRITEDATA, NULL); //On fait semblant d'avoir un fichier curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction curl_easy_perform(session); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ getchar() return 0; }
Teste ça et dis moi ce que ça donne.
Remplace ma fonction par ça:
size_t buffer_write (const void *ptr, size_t size, size_t nmemb, FILE *stream) { int i; char *myptr = (char *) ptr; buffer = (char *) realloc(buffer, size * nmemb); for (i=0; i < size * nmemb; i++) { buffer[i + offset] = myptr[i]; offset++; } return size * nmemb; }
Il y a un bloquage sur la première accolade de la version que j'ai publié dans ma dernière réponse.
Teste avec la dernière version que je viens de poster.
=> http://www.commentcamarche.net/forum/affich 9060910 un prog pour lire la source d une page web?#21
=> http://www.commentcamarche.net/forum/affich 9060910 un prog pour lire la source d une page web?#21
alors ça s'est executé ( ouverture fermeture de la fenêtre d'execution).
ce que je peux dire, c'est que jusqu'à
.. ça marche. mais ensuite ça ne marche plus. ( j'ai inséré printf ("2") juste avant getchar(), et il n'est pas apparut.
ce que je peux dire, c'est que jusqu'à
return size * nmemb; }
.. ça marche. mais ensuite ça ne marche plus. ( j'ai inséré printf ("2") juste avant getchar(), et il n'est pas apparut.
voici les test que j'ai mis :
C'a s'arrête au N°5, c'est donc curl_easy_perform qui ne fonctionne pas. Quest ce que ça peut vouloir dire ?
int main(int argc, char **argv) {printf ("1"); CURL *session = curl_easy_init(); /*Initialisation de la session */ printf ("2"); curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */ printf ("3"); curl_easy_setopt(session, CURLOPT_WRITEDATA, NULL); //On fait semblant d'avoir un fichier printf ("4"); curl_easy_setopt(session, CURLOPT_WRITEFUNCTION, buffer_write); //On passe notre fonction printf ("5"); curl_easy_perform(session); printf ("6"); curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */ printf ("7"); getchar(); return 0; }
C'a s'arrête au N°5, c'est donc curl_easy_perform qui ne fonctionne pas. Quest ce que ça peut vouloir dire ?
printf ("2");
curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */
printf ("3");
curl_easy_setopt(session, CURLOPT_WRITEDATA, NULL); //On fait semblant d'avoir un fichier
printf ("4");
curl_easy_setopt(session, CURLOPTiuh_WRITEFUNCTION, buffer_write); //On passe notre fonction
printf ("5");
curl_easy_perform(session);
printf ("6");
curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */
printf ("7");
getchar();
return 0;
curl_easy_setopt(session, CURLOPT_URL, "www.sfgate.com"); /*Ici on précise l'url */
printf ("3");
curl_easy_setopt(session, CURLOPT_WRITEDATA, NULL); //On fait semblant d'avoir un fichier
printf ("4");
curl_easy_setopt(session, CURLOPTiuh_WRITEFUNCTION, buffer_write); //On passe notre fonction
printf ("5");
curl_easy_perform(session);
printf ("6");
curl_easy_cleanup(session); /*Enfin, on libère nos ressources utilisées */
printf ("7");
getchar();
return 0;
Non, attends ! je crois queje sais
curl easy perform sert à lancer le téléchargement !
Or comme je ne veux aps télécharger c'est tout à fait logique ! ( je n'ai rien défini, ni fichier destination, ni ecriture), donc au lieu de curl easy perform, ce qu'il faut c'est un truc qui affiche le code source de la page lui même !
quelque chose comme printf ("%u", &code_source)
non ?
curl easy perform sert à lancer le téléchargement !
Or comme je ne veux aps télécharger c'est tout à fait logique ! ( je n'ai rien défini, ni fichier destination, ni ecriture), donc au lieu de curl easy perform, ce qu'il faut c'est un truc qui affiche le code source de la page lui même !
quelque chose comme printf ("%u", &code_source)
non ?
oui, et une fois que je ferme le programme, je ne veux plus aucune trace , aucun fichier sur le disque,
un peu comme un copier coller qu'on perd parce qu'on ne le sauvegarde pas.
un peu comme un copier coller qu'on perd parce qu'on ne le sauvegarde pas.