Salut, j'ai enfin franchit (j'espere) le pas d'utilisateur qui ne contribue pas a ma premiere contribution au libre.
je vous presente libwebdoc telechargeable
sur sourceforge.
ce que c'est?
c'est une lib qui permet de telecharger des pages web, lire des xml, traiter les chaines de caracteres comme en python... mais en C.
pourquoi
Je suis plus a mon aise en C et je trouvais anormal que ce soit si compliquer de pliter des chaines de charactere et autre.
a l'origine j'ecrivais un spider en python puis j'ai voulu le refaire en C. et la ca a ch**. bref vous me direz qu'il existe liburl mais je l'ai trouve trop riche et compliquer.
Pour le moment ca comprend
www.h fontions relative au web. un peu crade avec des fonctions obsolete que j'ai pas encore effacer.
html.h essayant de decripter le code html, plus crade que
www.h a netoyer
xml.h ecriture de fichier xml only pas crade
rss.h lecture de flux rss only encore moins crade que pas crade
cgstring traitement sur les chaines. je sais pas si c'est crade
la version est a 0.3 ou les plus basiques sont deja la. en attendant je sais pas ou l'herger et si meme ca va interresser d'autre que moi donc je vous montre un peu ce qu'on peut faire pour vous donner envis avec 3exemples: le premier montre ce que fait cgstring. le second juste la lecture d'un rss. le 3 eme extraction du contenue d'une page web.
exemple 1 cgstring:
#include <www/cgstring.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc,char **argv)
{
char *str = malloc(sizeof(char)*(lenStr("today Yis Ya nYew day Y")+1));
sprintf(str,"today Yis Ya nYew day Y");
printf("replaceStr:\n\t[b] %s\n",str);
int res=replaceStr(&str,"Y",NULL,3);
printf("\t[A] %s\nNumber of char changed:%d\n\n",str,res);
char **spl = splitStr(" tous les jours sont chaud "," ");
int i=0;
puts("splitStr:\nsplit(\" tous les jours sont chaud \",\" \");");
while(spl[i]!=NULL)
{
printf("\t%s\n",spl[i]);
++i;
}
releaseStr(spl);
puts("\n\nstrTOint and strTOdouble:\n");
int vv = strTOint("0001,000,000",&i);
printf("\t0001,000,000 = %d error =%d\n",vv,i);
double val = strTOdouble("-1,234,432.1239",&i);
printf("\t-1,234,432.1239 = %f error =%d\n",val,i);
vv = strTOint("0001,000,re342",&i);
printf("\t0001,000,re342 = %d error =%d\n",vv,i);
puts("\n\nstrISnumber:\n");
printf("\t-1,234,567,890 is number %d\n",strISnumber("-1,234,567,890"));
printf("\t+1,234,909.1 is number %d\n",strISnumber("+1,234,909.1"));
printf("\t-345+234 is number %d\n",strISnumber("-345+234"));
printf("\t-23.3,302 is number %d\n\n",strISnumber("+23.3,302"));
free(str);
str=malloc(sizeof(char)*(lenStr("ther is so spaces !")+1));
sprintf(str,"ther is so spaces !");
printf("cleanExtraStr extra spaces:\n\t[b] \"%s\"\n",str);
cleanExtraStr(&str," ");
printf("\t[A] \"%s\"\n\n",str);
free(str);
str=malloc(sizeof(char)*(lenStr("line 1\n\nline 2\n\n\n\nline 3\n")+1));
sprintf(str,"line 1\n\nline 2\n\n\n\nline 3\n");
printf("cleanExtraStr extra lines:\n\t[b] \"%s\"\n",str);
cleanExtraStr(&str,"\n");
printf("\t[A]\n%s\n\n",str);
free(str);
return 0;
}
exemple 2 voyer que le code est allonge du faite que je veux tout afficher sinon la mise en memoire du RSS se fait en 5 lignes:
#include <stdlib.h>
#include <stdio.h>
#include <www/cgstring.h>
#include <www/rss.h>
#include<www/www.h>
int main(int argc,char **argv)
{
if(argc<2)
return 0;
char *hp = getHTTPInfo(argv[1],0,NULL);
if(hp==NULL)
{
puts("download failed");
return 0;
}
puts("download completed\n***************\n\n");
WebPage *wp = setStructWWW(hp);
free(hp);
if(wp==NULL)
return 0;
RSSchannel *Rss = RSSbuild(wp->html);
releaseWebPage(&wp);
if(Rss==NULL)
{
puts("rss ERROR");
return 0;
}
printf("RSS channel:\n\ttitle:%s\n\tlink:%s\n",Rss->title,Rss->link);
printf("\tdescription:%s\n\tlanguage:%s\n",Rss->description,Rss->language);
printf("\tmanagingEdit:%s\n\twebMaster:%s\n",Rss->managing,Rss->webMaster);
printf("\tpubDate:%s\n\tlastBuildD:%s\n",Rss->pubDate,Rss->lastBuildDate);
printf("\tcategory:%s\n\tgenerator:%s\n",Rss->category,Rss->generator);
printf("\tttl:%d\n\tdocs:%s\n\t<img>\n",Rss->ttl,Rss->docs);
if(Rss->image_struct!=NULL)
{
printf("\t\turl:%s\n\t\ttitle:%s\n",Rss->image_struct->url,Rss->image_struct->title);
printf("\t\tlink:%s\n\t</img>\n\n",Rss->image_struct->link);
}
if(Rss->textInput_struct!=NULL)
{
puts("\t<textInput>");
printf("\t\ttitle:%s\n\t\tdesc:%s\n",Rss->textInput_struct->title,Rss->textInput_struct->description);
printf("\t\tname:%s\n\t\tlink:%s\n",Rss->textInput_struct->name,Rss->textInput_struct->link);
puts("\t</textInput>");
}
puts("End Channel Info");
printf("\ntotal Items:%d\n\nItems:\n",Rss->nItem);
if(Rss->listItem!=NULL)
{
RSSprintItems(Rss->listItem);
}
puts("End\n");
releaseRSSchannel(&Rss);
return 0;
}
exemple 3 :
ici on extrait le contenu d'une page web qu'on ecrit dans un fichier xml
#include <stdlib.h>
#include <stdio.h>
#include <www/xml.h>
#include <www/www.h>
#include <www/cgstring.h>
int main(int argc,char **argv)
{
if(argc<2)
return 0;
setUserAgent("WebDoc_tester");
char *hp = getHTTPInfo(argv[1],0,NULL);
if(hp==NULL)
{
puts("download failed");
return EXIT_FAILURE;
}
puts("download completed");
WebPage *wp = setStructWWW(hp);
free(hp);
if(wp==NULL)
{
puts("wp failed");
return EXIT_FAILURE;
}
puts("trying content");
char *con = htmlTryGetContent(wp->html);
if(con == NULL)
{
releaseWebPage(&wp);
return EXIT_FAILURE;
}
htmlstrip_tags(&con);
html_strip_contentClean(&con);
// xml_FastformatHTMLEntity(&con); on en a pas besoin ici car writeEntry le fait deja si le 3eme argument est XML_HTML
xml_create("test.xml",NULL,NULL,NULL);
xml_startRoot("page",NULL);
xml_writeEntry("title",NULL,wp->met_title,XML_CDATA);
xml_writeEntry("url",NULL,argv[1],XML_HTML);
xml_writeEntry("charset",NULL,wp->met_charset,XML_HTML);
xml_writeEntry("keywords",NULL,wp->met_keywords,XML_HTML);
xml_writeEntry("content",NULL,con,XML_HTML);
xml_endRoot();
releaseWebPage(&wp);
free(con);
return EXIT_SUCCESS;
}
j'ai ecris aussi un pdf qui explique toutes les functions et donnes des exemples d'utilisations (en anglais j'ai la fleme de traduire).
bref je met ici en premier en esperant que ca sera utile a quelqu'un.
bref j'ai ecris ca en essayant de faire ensorte que le programmeur tape le moins de code possible sauf bien sur les free et autre releasequelquechose() ex: splitStr() et releaseStr() donc 2 fonctions quand avec python on en a qu'une mais bon c'est mieux que rien car en C il faudra ecrire au moins 30 lignes pour faire un split.
pour la partie web pour le moment seul GET et http sont pris en charge d'ailleur il ya une fonction pour telecharger les fichier en http mais je prevois d'ajouter pour http POST aussi et d'autre protocols FTP et autres.
www. et html ont ete fait dans le cadre de mon boulot en accelere le reste je l'ai fait a la maison donc je prennais mon temps. quand mon boss a trouver ma lib inutile et me l'a offerte j'ai decide que si ca appartiendrai donc a tout le monde. bref si vous etes programmeur regardez le code et critiquez si non vous pouvez utiliser et vous plaindre de mal fonctionnement.
MERCI