2010-12-02 29 views
0

Mon application obtient dans le cadre de ses données un grand fichier au format html qui contient de grandes quantités de liens. Quelque chose comme ce que vous obtiendriez si vous recherchez n'importe quoi sur Google ou Yahoo ou d'autres moteurs de recherche: une liste d'URL et la description ou tout autre texte.Analyser les informations d'une URL sur un HTML <a></a> Tags dans C

J'ai essayé de sortir avec une fonction qui peut analyser l'URL et la description et les enregistrer dans un fichier texte, mais il s'est avéré difficile, au moins pour moi. Donc, si j'ai:

<a href="http://www.w3schools.com">Visit W3Schools</a>

Je http://www.w3schools.com et analyser Visit W3Schools et les enregistrer dans un fichier.

Un moyen d'y parvenir? en plaine C?
Toute aide est appréciée.

+0

Si le HTML est vraiment juste '...' alors vous pouvez utiliser XSL. Sinon, vous aurez besoin d'un analyseur HTML complet. Peut-être même un script shell + ** Lynx ** (un navigateur basé sur le texte) + ** awk **. Si c'est une tâche ponctuelle, alors je chercherais/remplacerais dans un éditeur. (Encore une fois, en supposant que XHTML bien formé.) –

+0

c'est juste un simple fichier html. le est juste cela. Maintenant, je ne veux pas utiliser les bibliothèques ou les analyseurs html externes. Je veux juste lire le fichier et analyser l'URL et la description. – Jessica

+0

La principale raison pour laquelle cela vous a été difficile est que vous essayez de le faire en C. C est vraiment, vraiment, * vraiment * pas construit pour ce genre de tâche. Les langages plus récents fournissent des outils beaucoup plus sophistiqués pour la manipulation de chaînes. C n'a même pas de véritable type de texte intégré; quand vous utilisez char \ * et char [N], vous faites semblant. –

Répondre

1

Vous avez vraiment besoin d'un analyseur HTML approprié, mais pour quelque chose de rapide et sale, essayez:

bool get_url(char **data, char **url, char **desc) 
{ 
    bool result = false; 
    char *ptr = strstr(*data, "<a"); 

    if(NULL != ptr) 
    { 
    *data = ptr + 2; 

    ptr = strstr(*data, "href=\""); 
    if(NULL != ptr) 
    { 
     *data = ptr + 6; 
     *url = *data; 

     ptr = strchr(*data, '"'); 
     if(NULL != ptr) 
     { 
     *ptr = '\0'; 
     *data = ptr + 1; 

     ptr = strchr(*data, '>'); 
     if(NULL != ptr) 
     { 
      *data = ptr + 1; 
      *desc = *data; 

      ptr = strstr(*data, "</a>"); 
      if(NULL != ptr) 
      { 
      *ptr = '\0'; 
      *data = ptr + 4; 
      result = true; 
      } 
     } 
     } 
    } 
    } 

    return result; 
} 

Non que data est mis à jour pour être au-delà des données analysées (il est un paramètre in-out) et que la La chaîne transmise est modifiée. Je me sens paresseux/trop occupé pour faire des solutions complètes avec des chaînes de retour allouées en mémoire.

De même, vous devriez probablement renvoyer des erreurs sur la cascade d'accolades proches (sauf la première), ce qui explique en partie pourquoi je les ai empilées comme ça. Il existe d'autres solutions plus simples qui peuvent être adaptées pour être plus génériques.

Donc, fondamentalement, vous appelez ensuite la fonction plusieurs fois jusqu'à ce qu'elle renvoie false.

+0

super, laissez-moi essayer – Jessica

+0

Cool, j'ai juste besoin de comprendre la taille maximale pour le char * et je suis prêt. Merci pour l'aide! – Jessica