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 :

parsing d'une variable javascript tableau


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 116
    Par défaut parsing d'une variable javascript tableau
    Bonjour,

    Je parse des données depuis un site, il se trouve qu'une des pages utilise de l'immonde javascript pour stocker les informations que je veux, dans un tableau complexe en plus

    Voici la var:
    Code : 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
    <script language="JavaScript"><!--
    	var myMenu =
    	[
    		['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif" /></i></span>', '/', '#', '', '', 
    		['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat1', '#', '', '',
    		['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat1.1', '#', '', '',,['','TitleDoc1.1 (Doc1.1.txt)','https://***/docman/view.php/22/9/Doc1.1.txt','','DescDoc1.1 10Char' ],
    		],
    		['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat1.2', '#', '', '',,
    		],,['','Agenda1 (Dummy.txt)','https://***/docman/view.php/22/14/Dummy.txt','','DescriptionAgenda1' ],['','TitleDoc1 (Doc1.txt)','https://***/docman/view.php/22/8/Doc1.txt','','DescDoc1 10 char' ],
    		],
    		['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat2', '#', '', '',,['','TitleDoc2 (Doc2.txt)','https://***/docman/view.php/22/10/Doc2.txt','','DescriptionDoc2' ],['','TitleDoc2.1 (Doc2.1.txt)','https://***/docman/view.php/22/12/Doc2.1.txt','','DescriptionDoc2.1' ],['','TitleDoc2.2 (Doc2.2.txt)','https://***/docman/view.php/22/11/Doc2.2.txt','','DescriptionDoc2.2' ],
    		],
    		['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Uncategorized Submissions', '#', '', '',,['','uncategDocument (DocPasCateg.txt)','https://***/docman/view.php/22/13/DocPasCateg.txt','','DescriptionUncatDoc' ],
    		],		]
    	];
    	ctDraw ('myMenuID', myMenu, ctThemeXP1, 'ThemeXP', 0, 1);
    	--></script>
    Une fonction se sert ensuite de cette var pour faire une sorte de vue en arborescence dynamique dossier/fichier. Moi je veux parser le nom des dossiers (Cat1, Cat1.1, Cat2...) et les fichiers (pour le dernier par exemple, titre UncatDocument (le titre), DocPasCateg.txt (le nom du fichier), le lien pour dl le fichier en question, et la description (DescriptionUncatDoc).

    Je m'en sors pas, pour du html tout beau BeautifuLSoup marche bien, mais cette variable me casse la tête et je trouve pas de regex pour récupérer ce que je veux :/

    Une idée d'un outil à utiliser ou d'une regex magique?

    Merci,
    Hydex

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bonjour,



    Qu’est ce que c’est, ce qui se trouve dans la fenêtre Code: ?
    du code Javascript ? du code Python ? des lignes de caractères qui sont celles du code source du site ?



    Ce qui m’intrigue est la structure du genre

    [’abc’+Theme+’abc’+Theme+’abc’, '/', '#', '', '',
    [’abc’+Theme+’abc’+Theme+’abc’,'Cat1', '#', '', '',
    [’abc’+Theme+’abc’+Theme+’abc’,'Cat1.1', '#', '', '',,[moult],
    ],

    À quoi correspondent les crochets ? Liste ? Caractères ? Autre chose ?




    Qu’est ce que ctThemeXPBase ?



    Quelle est la variabilité des parties stables ?
    Ex: 'folderopen1.gif" /></i></span>' dans la première ligne,
    'folderopen1.gif"></i></span>' dans les autres




    Une regex ne devrait pas êre trop dur à trouver, mais je n’ai pas le temps avant ce soir.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Par défaut
    Bonjour,

    J'ai écrit une boucle (avec 2 boucles imbriquées) qui retrouve le dossiers. Le truc utilisé est le fait que les nom de dossiers 'Cat1', 'Cat1.1' sont dans des listes et sont suivis dans la liste par un élément '#'.
    code:
    Code : 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
    ctThemeXPBase = "ctThemeXPBase"
    L =  [# /:
        ['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif" /></i></span>', '/', '#', '', '',
            # Cat1:
            ['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span                         class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat1', '#', '', '', 
                # Cat1.1
                ['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat1.1', '#', '', '', 
                    ['','TitleDoc1.1 (Doc1.1.txt)','https://***/docman/view.php/22/9/Doc1.1.txt','','DescDoc1.1 10Char' ],
                ],
                # Cat1.2:
                ['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat1.2', '#', '', '', 
                ],
     
                ['','Agenda1 (Dummy.txt)','https://***/docman/view.php/22/14/Dummy.txt','','DescriptionAgenda1' ],
                ['','TitleDoc1 (Doc1.txt)','https://***/docman/view.php/22/8/Doc1.txt','','DescDoc1 10 char' ],
            ],
            # Cat2:
            ['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Cat2', '#', '', '',
                ['','TitleDoc2 (Doc2.txt)','https://***/docman/view.php/22/10/Doc2.txt','','DescriptionDoc2' ],
                ['','TitleDoc2.1 (Doc2.1.txt)','https://***/docman/view.php/22/12/Doc2.1.txt','','DescriptionDoc2.1' ],
                ['','TitleDoc2.2 (Doc2.2.txt)','https://***/docman/view.php/22/11/Doc2.2.txt','','DescriptionDoc2.2' ],
            ],
     
            ['<span class="JSCookTreeFolderClosed"><i><img alt="" src="' + ctThemeXPBase + 'folder1.gif" /></i></span><span class="JSCookTreeFolderOpen"><i><img alt="" src="' + ctThemeXPBase + 'folderopen1.gif"></i></span>', 'Uncategorized Submissions', '#', '', '',
                ['','uncategDocument (DocPasCateg.txt)','https://***/docman/view.php/22/13/DocPasCateg.txt','','DescriptionUncatDoc' ],
            ]
        ]
        ]
    for l in L:
        print "premier dossier:", repr(l[l.index('#')-1])
        for li in filter(lambda x: type(x) == list, l):
            if '#' in li:
                print "sous-dossier dossier:", repr(li[li.index('#')-1])
                for mi in filter(lambda x: type(x) == list, li):
                    if '#' in mi:
                        print "sous-sous-dossier dossier:", repr(mi[mi.index('#')-1])
    On fait tourner et ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    premier dossier: '/'
    sous-dossier dossier: 'Cat1'
    sous-sous-dossier dossier: 'Cat1.1'
    sous-sous-dossier dossier: 'Cat1.2'
    sous-dossier dossier: 'Cat2'
    sous-dossier dossier: 'Uncategorized Submissions'
    Si il y a une plus grande profondeur de sous-dossiers, à mon avis il faut supprimer les boucles imbriquées et écrire une petite fonction récursive.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Par défaut
    ceci recupere tout, dans l'ordre.
    on peut modifier ci et là pour obtenir l'information sous une forme plus adéquate.
    Code : 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
    import re
     
    def is_doc_list(l):
        return any(map(lambda x: '.txt' in x, l))
     
    def get_info(x):
        title_and_name = x[1]
        link = x[2]
        description = x[4]
        pat_1 = r"([\w.]+)\s+\(([\w.]+)\)"
        m1 = re.search(pat_1, title_and_name)
        return m1.groups(), link, description
     
     
    def job(M, i):
        if type(M) is list:
            for m in M:
                if '#' in m and len(m)>2:
                    print " "*i + str(i) + ')' +"dossier:", repr(m[m.index('#')-1])
                if is_doc_list(m):
                    print " "*(i+1) + "file information:", get_info(m)
                job(m, i + 1)
     
    if __name__ == "__main__":
        job(L, 1)
    J'ai initialisé à la main la variable L,...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 116
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Bonjour,



    Qu’est ce que c’est, ce qui se trouve dans la fenêtre Code: ?
    du code Javascript ? du code Python ? des lignes de caractères qui sont celles du code source du site ?



    Ce qui m’intrigue est la structure du genre

    [’abc’+Theme+’abc’+Theme+’abc’, '/', '#', '', '',
    [’abc’+Theme+’abc’+Theme+’abc’,'Cat1', '#', '', '',
    [’abc’+Theme+’abc’+Theme+’abc’,'Cat1.1', '#', '', '',,[moult],
    ],

    À quoi correspondent les crochets ? Liste ? Caractères ? Autre chose ?




    Qu’est ce que ctThemeXPBase ?



    Quelle est la variabilité des parties stables ?
    Ex: 'folderopen1.gif" /></i></span>' dans la première ligne,
    'folderopen1.gif"></i></span>' dans les autres




    Une regex ne devrait pas êre trop dur à trouver, mais je n’ai pas le temps avant ce soir.
    C'est un bout de javascript dans le code source d'une page, qui contient du formatage mélangé à des informations que je veux extraire (catégories, et fichiers dans ces catégories)
    Qu’est ce que ctThemeXPBase ?



    Quelle est la variabilité des parties stables ?
    Ex: 'folderopen1.gif" /></i></span>' dans la première ligne,
    'folderopen1.gif"></i></span>' dans les autres
    C'est du bruit! A priori c'est du fixe.


    Citation Envoyé par miawaw Voir le message
    ceci recupere tout, dans l'ordre.
    on peut modifier ci et là pour obtenir l'information sous une forme plus adéquate.
    Code : 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
    import re
     
    def is_doc_list(l):
        return any(map(lambda x: '.txt' in x, l))
     
    def get_info(x):
        title_and_name = x[1]
        link = x[2]
        description = x[4]
        pat_1 = r"([\w.]+)\s+\(([\w.]+)\)"
        m1 = re.search(pat_1, title_and_name)
        return m1.groups(), link, description
     
     
    def job(M, i):
        if type(M) is list:
            for m in M:
                if '#' in m and len(m)>2:
                    print " "*i + str(i) + ')' +"dossier:", repr(m[m.index('#')-1])
                if is_doc_list(m):
                    print " "*(i+1) + "file information:", get_info(m)
                job(m, i + 1)
     
    if __name__ == "__main__":
        job(L, 1)
    J'ai initialisé à la main la variable L,...
    Super merci beaucoup, je vais tester ça !




    Les regexp ne sont pas mes amies malheureusement :/

Discussions similaires

  1. envoyer une variable(un tableau) via un lien href
    Par sebduduf dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 11/11/2005, 16h52
  2. Utilisation d'une variable Javascript en html
    Par Crazynoss dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/10/2005, 16h43
  3. [PHP-JS] Récuperer une variable javascript..
    Par gwendy dans le forum Langage
    Réponses: 3
    Dernier message: 17/10/2005, 21h24
  4. Affecter une variable javascript à une variable php
    Par gwendy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 20h58
  5. Récupérer une variable --> Javascript+CSS
    Par Skarlix dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/08/2005, 16h01

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