Bonjour,
j'aimerais enlever les balises html d'une page et récupérer du texte simple. Est ce que quelqu'un connaît une bibliothèque toute faite ou comment il faut faire???
Merci
Version imprimable
Bonjour,
j'aimerais enlever les balises html d'une page et récupérer du texte simple. Est ce que quelqu'un connaît une bibliothèque toute faite ou comment il faut faire???
Merci
Salut,
Je ne sais pas vraiment si une bibliotheque existe, mais ça ne parait pas bien compliqué à réaliser...
Il suffit de lire un fichier html (comme un fichier texte) et recopier dans un second fichier (texte) seulement les caractères qui sont hors des balises.
En gros :
Code:
1
2
3
4
5 Pour tout caractère c si c = '<' alors recherché le prochain caractere '>' (sans copier les caractères intermèdiaire dans le second fichier) sinon copier c dans le second fichier
Merci pour ta réponse. J'y avais pensé aussi mais mon problème c'est que si la page html contient un < ou un > sans que ca soit une balise (pck tout le monde ne sait pas qu'il faut remplacer ce genre de chose par un code), je suis mal pour appliquer cette technique.
Nan l'HTML ne definit pas ce qu'il faut faire si un < ou un > n'introduit pas l'ouverture/fermeture d'une balise, c'est juste que les navigateurs le gerent par laxisme ou histoire de se dire "moi au moins je sais lire le code html le plus crade du monde"
@anihat :
pas forcément..
Primo tu regardes si effectivement il y a un > suivant un <.
Ensuite, 2 possibilités :
- si il n'y en a pas, c'est un vrai caractère <.
- si il y en a : il n'y a que peu de possibilités de mots-clés, puisque c'est pour ça que HTML a été créé, c'est d'avoir peu de mots. Donc tu peux regarder d'abord si il y a un signe "=" entre les 2, ou si le caractère suivant est un "/", et enfin passer à travers les mots-clés : LIST, BODY, FONT, IMG, etc..
Merci pour vos réponses mais pour l'instant le problème n'est pas résolu. L'algorithme n'est pas du tout optimisé car une boucle pour chercher le prochain < ou > prend 99% du temps CPU donc je ne peux plus rien faire à côté. Et je tiens à signaler que je ne compte pas enlever les balises sur une dixaine de pages mais sur des milliers, voire des millions de pages.
Si quelqu'un a une idée sur la librairie à utiliser ce serait sympa.
Merci d'avance
Pourquoi ne pas utiliser des expressions régulières. Tu cherches tout ce qui correspond à <quelquechose> et tu le vire. Je ne suis pas expert en C mais en java ça revient à virer les trucs de la forme <.*?>. Tu a un cours par la. Et c'est bien plus rapide qu'une analyse char par char faite à la cochon.
salut
le HTML c'est du XML, donc tu peut juste utiliser un parseur XML simple pour convertir la page HTML en n'importe qu'elle autre format que tu veut
Ca existe peut être.Citation:
Envoyé par anihat
Si tu veux le faire à la main, l'algorithme pour retirer les balises html est simple, sachant qu'elle commence par < et se termine par >. Mais ca ne veut pas dire que le texte sera lisible...
Il risque notamment d'y avoir des lignes très longues qui représentent chacune un paragraphe (et encore, c'est même pas sûr, tout pourait exister sur une seule ligne...)...
Dans un traitement de texte, c'est supportable, mais dans un éditeur, ça va être horrible à moins d'activer "l'auto wrap"...
Il y a donc peut être un traitement un peu plus subtil à faire pour extraire des données textes lisibles d'un fichier html...
Je dis ça, je dis rien...
C'est un vrai problème, mais il n'y a pas d'autre solution. Tu n'es pas responsable du mauvais codage de la page html.Citation:
Envoyé par anihat
Tu peux cependant la passer au vérificateur avant :
http://validator.w3.org/
et la corriger à la main, mais c'est du boulot...
Si tu veux rendre du CPU, tu mets unCitation:
Envoyé par anihat
WIN32 : Sleep(1);
UNX : usleep(1);
de temps en temps (par exemple, tous les 1000, 10000, 100000 caractères, à optimiser...) dans la boucle et c'est tout... C'est pas un problème de bibliothèque (qui risque de ne pas faire ça et de bloquer le CPU tout autant...)
Mais si tu traites des fichiers, tu n'as pas besoin de ça, car pendant les I/O, le processus est suspendu...
Tu peux montrer le code et les conditions d'exécution ?
Plus simple pour rendre du CPU sous Windows: Baisser la priorité du processus avec SetPriorityClass() ou du thread avec SetThreadPriority(), au début du traitement.
L'équivalent sous *n*x, c'est la fonction nice().
Avec cela, le CPU restera utilisé à 100%, mais le programme n'empêchera pas les autres de tourner.
Citation:
Envoyé par anihat
je te signale quand même qu'il ya des fonctions standard qui cherchent...
strchr
J'ai trouvé la solution la plus performante, avec des expressions régulières et une boucle dans laquelle on ne fait que du strcpy, on divise par 4 la charge du CPU. En tous cas la piste du recopiage char par char dans une boucle n'est pas la bonne si on parle performance.
Merci à tous d'avoir répondu. :D
J'avais réalisé une fonction de ce type il y a quelque temps, par contre je ne sais pas ce qu'elle donne en terme de performance.
Je la donne quand même
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 void shift_left(char *string) { size_t i = 0; for(i = 0; i < strlen(string); i++) { string[i] = string[i+1]; } } void remove_html(char *string) { char *p_search = NULL; while((p_search = strchr(string, '<')) != NULL) { while(p_search[0] != '>' && p_search[0] != 0) { shift_left(p_search); /* clear the mark-up */ } shift_left(p_search); /* clear the end of the mark-up */ } /* the string is cleared */ }
Pas très bon ça, pour la performance....Citation:
Envoyé par Skyrunner
Citation:
Envoyé par Médinoc
puisque le post a été réactivé pour signaler résolu, je rajouterais ici que pour *n*x c'est encore plus simple (sans modifier le code aucunnement). Il suffit de lancer le programme avec "nice " et la priorité que l'on veut y mettre :mrgreen:
Ou sous Windows avec "start /low " + programme.
strlen() dans la boucle, bof bof...Citation:
Envoyé par Skyrunner
Renseigne toi sur memmove()...
Hun hun bonne idée, je pense jamais à utiliser memcmp, memcpy, memmove.Citation:
Envoyé par Emmanuel Delahaye
Code:
1
2
3
4 void shift_left(char *string) { memmove(string, string + 1, strlen(string)); }