IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Recherche de mots clés dans un ensemble de fichiers avec retour des noms de fichiers ? (rien que ça. . .)


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut Recherche de mots clés dans un ensemble de fichiers avec retour des noms de fichiers ? (rien que ça. . .)
    Bonjour à tous,
    Je cherche à faire un programme qui va peut-être vous laisser dubitatifs... car il concerne les meta "keywords" dans les pages html qui ne sont plus du tout utilisée aujourd'hui, mais j'en aurais quand même besoin pour un projet... Voilà le topo :
    Pour des pages html enregistrées EN LOCAL, je voudrai faire une sorte de petit moteur de recherche qui analyse les mots clés "keywords" et les titres <title> des pages contenus dans des fichiers html et qui renvoie les noms des fichiers qui contiennent ces mots clés ou ces titres...

    Dans un ensemble de pages html contenu dans un dossier sur le PC, je souhaite mettre des mots clés dans des balises meta :
    Par exemple, une page html traitant du WWW contiendrait : <meta name="keywords" content="www, toile, hyperlien" /> et <title>www</title>)
    Une autre page traitant des hytperliens contiendrait : <meta name="keywords" content="hyperlien, hypertexte, Ted Nelson " /> et <title>hyperliens</title>)
    Etc...

    Je voudrais donc faire un petit programme python qui soit capable de rechercher dans l'ensemble des fichiers de mon dossier "site" un mot clé passé en paramètre et qui renvoi en premier les pages dont c'est le titre puis les pages qui possèdent ce mot dans ses "keywords"...

    Je précise que je suis débutant en python (mais je connais bien les principes des langages de programmation quand même...).

    En cherchant un peu sur le Net, j'ai trouvé déjà cela : et ça fonctionne avec les fichier .html comme si c'était des fichier .txt, et c'est déjà ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chaine = "keywords" # Texte à rechercher
    fichier = open("www.html","r")
    for ligne in fichier:
        if chaine in ligne:
            print (ligne)
    fichier.close()
    J'obtiens donc la ligne voulue avec les keywords...
    Il faudrait alors que je récupère les mots et les compare... là, c'est plus difficile pour moi... J'imagine qu'il va falloir que je passe par des listes...

    J'ai vu aussi que Python pouvais lire en ensemble de fichiers d'un répertoire sur ce vieux post d'il y a 13 ans...
    https://www.developpez.net/forums/d3...aine-fichiers/

    Voilà, si vous avez des pistes à me donner pour commencer... je pars de zéro...
    Merci d'avance pour votre aide !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Je ne suis pas sûr d'avoir tout compris...

    Citation Envoyé par tichodrome Voir le message
    Dans un ensemble de pages html contenu dans un dossier sur le PC, je souhaite mettre des mots clés dans des balises meta :
    Ce n'est pas très clair... Tu veux mettre des mots clés dans une balise <meta name="keywords"... /> ou bien tu veux rechercher ces balises ?

    Citation Envoyé par tichodrome Voir le message
    Je voudrais donc faire un petit programme python qui soit capable de rechercher dans l'ensemble des fichiers de mon dossier "site" un mot clé passé en paramètre et qui renvoi en premier les pages dont c'est le titre puis les pages qui possèdent ce mot dans ses "keywords"...
    Ok pour les titres... Et pour les mots tu veux bien parler de ceux qui figurent dans l'attribut "content' des balises <meta name="keywords" content="..." />, c'est bien ça ?

    Citation Envoyé par tichodrome Voir le message
    En cherchant un peu sur le Net, j'ai trouvé déjà cela : et ça fonctionne avec les fichier .html comme si c'était des fichier .txt, et c'est déjà ça...

    J'obtiens donc la ligne voulue avec les keywords...
    Ce code est simple il recherche juste la chaine "keywords"... Cela peut fonctionner si la page ne contient pas ce mot ailleurs que dans la balise meta sinon il faudra faire une recherche plus précise...

    Oui on peut l'analyser comme un fichier texte ou on peut le parser : on aura plus de possibilités mais ce sera un peu plus long, à toi de voir si ça vaut le coup, si tu n'es pas pressé et que tu ne veux pas de prendre la tête, il y a des parser tout fait... Mais si tu veux que ça aille plus vite tu peux faire mini parser spécifique pour rechercher les balises <titre>, les balises <meta name="keywords" content="..." /> et récupérer le contenu de l'attribut "content'...

    Citation Envoyé par tichodrome Voir le message
    J'obtiens donc la ligne voulue avec les keywords...
    Il faudrait alors que je récupère les mots et les compare... là, c'est plus difficile pour moi... J'imagine qu'il va falloir que je passe par des listes...
    Si tout tient sur une ligne ça va mais sinon ce sera un peu plus compliqué... Dans tous les cas il faut récupérer le contenu de l'attribut "content'...

    Citation Envoyé par tichodrome Voir le message
    J'ai vu aussi que Python pouvais lire en ensemble de fichiers d'un répertoire sur ce vieux post d'il y a 13 ans...
    https://www.developpez.net/forums/d3...aine-fichiers/
    Il y a peut-être plus simple dans ton cas si tes fichiers sont tous dans le même répertoire...

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tichodrome Voir le message
    En cherchant un peu sur le Net, j'ai trouvé déjà cela : et ça fonctionne avec les fichier .html comme si c'était des fichier .txt, et c'est déjà ça...
    Ben oui, c'est normal que ça fonctionne "comme si" parce que les fichiers .html sont des fichiers textes. Mais bon ton exemple n'est pas franchement grandiose. Tu prends chaque ligne et tu regardes si elle contient "keywords". Pas vraiment besoin de "chercher" sur le net pour trouver ça quoi. En lisant le moindre tuto Python non seulement tu aurais eu les bases pour recréer cet exemple de toi-même mais en plus tu en aurais eu d'autres pour avancer un peu plus loin.

    Citation Envoyé par tichodrome Voir le message
    Il faudrait alors que je récupère les mots et les compare... là, c'est plus difficile pour moi... J'imagine qu'il va falloir que je passe par des listes...
    N'essaye pas d'employer des mots Python pour faire croire que tu connais Python. C'est d'ailleurs exactement le contraire. Aucun dev Python qui pose une question sur un forum n'irait dire qu'il pense devoir utiliser tel ou tel outil Python. Il exposerait son souci, lirait la réponse puis ensuite utiliserait les outils adéquats pour l'appliquer, outils qui se présenteraient d'ailleurs tellement naturellement à lui qu'il n'aurait même pas besoin de se dire "j'imagine que je vais devoir utiliser ceci ou cela". Est-ce qu'une fois que tu auras récupéré tes mots ceux-ci devront être modifiés ? Non. Donc pas besoin de listes. Les tuples peuvent aussi faire l'affaire. Mais peut-être que tu auras besoin d'affecter des caractéristiques aux mots trouvés. Donc pas de tuple mais un dictionnaire. Bref on regarde ce qu'on a et ensuite le container adéquat se présente de lui-même. Il faudra surtout que tu puisses extraire les mots d'une ligne et là on entre dans la caractérisation d'un mot. Mais si un mot est caractérisé par "truc entre deux espaces ou tabulations" alors ligne.split() sera un bon point de départ pour ça (chance pour toi, il se trouve que la méthode str.split() produit justement une liste !!!)

    Citation Envoyé par tichodrome Voir le message
    J'ai vu aussi que Python pouvais lire en ensemble de fichiers d'un répertoire sur ce vieux post d'il y a 13 ans...
    Oui. Et Python sait aussi calculer des intégrales. Est-ce que tu penses que ça te servira pour ton besoin précis ? As-tu besoin de lire les fichiers d'un répertoire ? Peut-être. Mais déjà t'as surtout besoin de savoir traiter "un" fichier. Si ensuite tu as besoin de traiter "tous" les fichiers alors ce ne sera que boucler sur "chaque" fichier pour traiter "un" fichier. Bref concentre toi déjà sur "un" travail, le reste c'est que dalle en comparaison.

    Citation Envoyé par tichodrome Voir le message
    Voilà, si vous avez des pistes à me donner pour commencer... je pars de zéro...
    Ouvrir un tuto et commencer à apprendre Python. C'est le réflexe à avoir quand on part de zéro. Même les plus grands dev Python de ce forum ont fait ça quand ils sont partis de zéro. Et aucun forum ne pourra faire ça à ta place.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut
    Bonjour,
    Merci pour vos réponses...

    @Beginner :
    Ok pour les titres... Et pour les mots tu veux bien parler de ceux qui figurent dans l'attribut "content' des balises <meta name="keywords" content="..." />, c'est bien ça ?
    - Oui, je mets à la main des mots clés <meta name="keywords"... /> avec un éditeur de texte puis j'utilise Python pour rechercher si le mot clé que je cherche figure derrière la balise <meta name="keywords"... /> ou derrière la balise <title>...

    Cela peut fonctionner si la page ne contient pas ce mot ailleurs que dans la balise meta sinon il faudra faire une recherche plus précise...
    - A priori, la chaine "keywords" ne figure qu'une seule fois par fichier html, surtout s'il est entre guillemets...

    Oui on peut l'analyser comme un fichier texte ou on peut le parser
    - Je ne souhaite pas "parser" le fichier html, seulement traiter les fichiers comme du texte, je pense que c'est plus simple.

    @Sce@r :
    ton exemple n'est pas franchement grandiose...
    N'essaye pas d'employer des mots Python pour faire croire que tu connais Python...
    Oui. Et Python sait aussi calculer des intégrales...
    Ouvrir un tuto et commencer à apprendre Python..
    Dis-donc, t'es un peu dur avec moi !
    C'est pas parce que je parle de "liste" que je veux faire croire que je maitrise Python, sinon, je n'aurais même pas posté une demande sur un forum d'entraide.
    Je me disais simplement qu'il faudrait sûrement récupérer la liste des mots qui figurent après meta name="keywords" content= sans en être sûr.
    Après, je ne suis pas là non plus pour demander une solution clé en main, mais plutôt des pistes pour savoir dans quelle direction partir.
    Si tu penses que je dois faire tout par moi-même, ok, je comprends mais ce n'est pas ma vision d'un forum d'entraide...
    Je viens là parce que je sais que je vais pouvoir entrer en contact avec des personnes qui maîtrisent bien le sujet et qui pourraient épauler des débutants... voilà ma vision...

    Bref, si je peux être plus concis et demander quand même cette aide : ce que j'ignore surtout, c'est comment faire la recherche d'une mot (passé en paramètre dans la console) uniquement dans la ligne <meta name="keywords"... /> ?
    Par exemple, si j'ai :
    <meta name="keywords" content="www, toile, hyperlien" />
    <title>www</title>
    et le terme www dans la partie <body>

    Puis si je cherche la chaîne "www", comment faire pour que le programme Python recherche ce terme dans la ligne qui suit le mot "keywords" et <title> mais pas dans le reste du fichier...

    Après, comme je disais, je parts de zéro, mais pas en Python, mais pour mon programme... j'ai moi aussi pris du temps pour apprendre à utiliser les bases de Python.
    Je me suis beaucoup entraîné sur le traitement des images pour changer les pixels de couleurs, passer en négatif, etc... j'ai regardé des tuto pour les chaînes de caractères, mais ça parait encore bien vaste pour mon cas...

    Voilà, merci en tous les cas pour vos réponses !

  5. #5
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    bonjour,

    il serait préférable d'utiliser des outils pour naviguer à travers le DOM, c'est à dire parser à l'aide d'outils comme ettre ou BeautifulSoup.
    Ici vous avez 2 problèmes: vous ne maîtrisez pas python et vous ne maîtrisez pas le HTML, du coup vous ne pouvez ni vous accrocher au parsing ni à un traitement "python pur".

    Regardez comment fonctionne le html, nœud, attribut, balise, ect pourrait vous aider à utiliser un parser correctement, utiliser ce dit parser pourrait vous aider à progresser en Python.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tichodrome Voir le message
    Bref, si je peux être plus concis et demander quand même cette aide : ce que j'ignore surtout, c'est comment faire la recherche d'une mot (passé en paramètre dans la console) uniquement dans la ligne <meta name="keywords"... /> ?
    Par exemple, si j'ai :
    <meta name="keywords" content="www, toile, hyperlien" />
    <title>www</title>
    et le terme www dans la partie <body>

    Puis si je cherche la chaîne "www", comment faire pour que le programme Python recherche ce terme dans la ligne qui suit le mot "keywords" et <title> mais pas dans le reste du fichier...
    Ben identifies et isoles d'abord les lignes contenant "meta" (ou même "<meta name=") et les lignes contenant "<title>" et oublies les autres.
    Ensuite ça reste du parsing ce qui oblige à se caler sur une constante spécifique. Peut-être le "content="...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 8
    Par défaut
    Ok, merci pour votre aide, mais je trouve que je me fais pas mal allumer la tête mais bon...
    Je vais creuser une solution plus basique que le parsing (et beautiful soup), juste des recherches de chaînes de caractères.
    Bonne soirée.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par tichodrome Voir le message
    Ok, merci pour votre aide, mais je trouve que je me fais pas mal allumer la tête mais bon...
    Certes mais, un fichier HTML ou un fichier XML sont des informations structurées que l'on va décortiquer avec les "parseurs" qui vont bien.

    Sûr que çà peut paraître compliqué quand on débute.... car vous ignorez encore pas mal de choses. Mais le seul remède à l'ignorance, c'est pas les forums mais passer du temps dans les tutos.

    Les forums viendront éventuellement compléter les tutos.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Comme parser il y a BeautifulSoup mentionné par flapili, il semble connu apparemment (en tous cas j'ai vu plusieurs membres du forum l'utiliser) mais j'ai découvert qu'il y avait un module intégré : html.parser... Il est simple, il ne semble pas proposer des méthodes permettant la manipulation du DOM comme BeautifulSoup mais on peut quand même l'utiliser pour faire ce que tu veux...

    De toute façon pour pouvoir utiliser des méthodes permettant la manipulation du DOM il faut parser tout le fichier ce qui prend quand même du temps or dans ton cas ce serait bien de pouvoir stopper le parsing dés que tu as trouvé les deux balises <title> et <meta name='keywords'> ou lorsqu'on quitte la balise <head> (puisque les deux balises que tu cherches doivent se trouver dans la balise head).

    Le module html.parser ne semble pas proposé de moyen de stopper le parsing quand on le souhaite alors j'ai dû utiliser un petit truc (un moyen qui provoque une exception avec la fonction reset ce qui n'est pas forcément propre mais bon...).

    Citation Envoyé par tichodrome Voir le message
    Je vais creuser une solution plus basique que le parsing (et beautiful soup), juste des recherches de chaînes de caractères.
    J'ai utilisé le parser intégré dont je parle ci-dessus mais si tu tiens à le faire sans parser c'est possible, cela peut ne pas être trop compliqué si le code html respectent certaines conditions (ce qui est une contrainte quand même).

    Enfin voici un exemple de code qui tient compte de ta condition (afficher "...en premier les pages dont c'est le titre puis les pages qui possèdent ce mot dans ses "keywords"..."). Cela t'aidera peut-être pour faire ton propre code ou à ajouter ce dont tu as besoin...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    import glob
    import os
    from html.parser import HTMLParser
     
    class MyHTMLParser(HTMLParser):
     
        def handle_starttag(self, tag, attrs):       
            if tag == "title":              # balise title           
                self.is_title_found = True
     
            elif tag == "meta":             # balse meta            
                for attr in attrs:               
                    # balise meta avec name="keywords"
                    if attr[0] == "name" and attr[1].strip() == "keywords":
                        for attr in attrs:
                            if attr[0] == "content":
                                self.lst_keywords = attr[1].replace(" ", "").split(",")
     
        def handle_data(self, data):
            if self.is_title_found:
                self.titre = data.strip()            
                self.is_title_found = False        
     
        def handle_endtag(self, tag):
            # le reset permet de stopper le parsing (histoire de gagner du temps)...
            # quand les deux balises <title> et <meta name='keywords'> sont trouvées 
            # ou lorsqu'on quitte la balise <head>        
            if self.titre != "" and len(self.lst_keywords) != 0 or tag == "head":          
                self.reset()
     
     
    parser = MyHTMLParser()
     
     
    def parse(HTML):
        parser.is_title_found = False
        parser.lst_keywords = []
        parser.titre = ""
        try:
            parser.feed(HTML)
        except Exception as e:
            pass
            # print(">>> reset:", e)
        return parser.titre, parser.lst_keywords
     
     
     
    def cherche(keyword):
        # Récupère la liste des fichiers .html
        liste_pages_html = glob.glob('Site/*.html')    
        liste_fichiers_titre = []
        liste_fichiers_keywords = []
     
        for page in liste_pages_html:
            with open(page, "r") as page_file:
                html = page_file.read()  
                res = parse(html)    
            if res[0] == keyword:            
                liste_fichiers_titre.append(os.path.basename(page))
            if keyword in res[1]:
                liste_fichiers_keywords.append(os.path.basename(page))
     
        print("---> Le mot clé:'" + keyword + "' a été trouvé dans la balise <titre> des fichiers suivants :\n", liste_fichiers_titre)
        print("---> Le mot clé:'" + keyword + "' a été trouvé dans la balise <meta name='keywords'> des fichiers suivants :\n", liste_fichiers_keywords)
     
        return liste_fichiers_titre, liste_fichiers_keywords
     
     
    resultat = cherche("www")

    - Attention tu dois modifier la ligne 50 liste_pages_html = glob.glob('Site/*.html') pour mettre le bon chemin de ton répertoire "site"...

    - A la ligne 14 if attr[0] == "name" and attr[1].strip() == "keywords": la fonction strip est une précaution au cas où tu mettrais un ou des espaces avant et/ou après le mot keywords, exemple avec un espace avant : " keywords" cela ne fonctionnerait pas sans cette fonction...

    - A la ligne 17 self.lst_keywords = attr[1].replace(" ", "").split(",") on utilise la fonction split suggérée par Sve@r mais avant il faut supprimer tous les espaces sinon on peut se retrouver avec un ou des espaces avant et/ou après les différents mots clés ce qui notamment poserait problème pour les futurs tests...

Discussions similaires

  1. [AC-2016] Recherche de mots clés dans document PDF
    Par cheikh98 dans le forum Access
    Réponses: 20
    Dernier message: 08/08/2016, 09h06
  2. Recherche de mots clés dans mails
    Par AAWOOPY56 dans le forum Lotus Notes
    Réponses: 1
    Dernier message: 13/12/2011, 08h55
  3. Réponses: 33
    Dernier message: 22/08/2011, 14h33
  4. Rechercher plusieurs mots clés dans un range
    Par omarter dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 24/11/2008, 13h21
  5. recherche par mots-clés dans base access
    Par syber72 dans le forum Access
    Réponses: 2
    Dernier message: 07/03/2006, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo