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 :

Récupérer des adresses sur Delicious


Sujet :

Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Récupérer des adresses sur Delicious
    Bonjour,
    j'ai le code HTML suivant à repérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <a rel="nofollow"
    class="taggedlink "
    href="http://code.google.com/p/spyderlib/" >
        spyderlib -  Project Hosting on Google Code
    </a>
    Je voudrais mettre cela dans un dictionnaire du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    myDeliciousTag["spyderlib -  Project Hosting on Google Code"]
    =
    "http://code.google.com/p/spyderlib/"
    Quelqu'un a-t-il une méthode toute simple à proposer ?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    en utilisant une expression régulière ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import re
     
    adresse = '''<a rel="nofollow"
    class="taggedlink "
    href="http://code.google.com/p/spyderlib/" >
        spyderlib -  Project Hosting on Google Code
    </a>'''
     
    adresse = adresse.replace('\n',' ') #pour traiter une chaine sans saut de lignes
     
    pattern = re.compile(r'^<a .*href="(.*)".*>[ ]*(.*)</a>$')
    s = pattern.search(adresse)
    print s.groups()
    retourne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('http://code.google.com/p/spyderlib/', 'spyderlib -  Project Hosting on Google Code ')

  3. #3
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,


    regex

    Le seul problème est de savoir si tu veux récupérer uniquement ce lien, un certain nombre de liens ou tous les liens dans une page html. Et en fonction de quels critères un lien est désirable ou non, c’est à dire quels sont les éléments autour d’un lien désirable dans la page html qui permettent son repérage, avec la stabilité/variabilité de ces éléments.

    Par exemple, s’il faut remplacer "nofollow" par certains noms seulement ou n’importe quel nom,... tu le feras toi-même. Pour le moment je propose ceci à l’arrache:


    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
     
    d = {}
     
    ch = '''blablablalkjhkjjgdc
    <a rel="nofollow"
    class="taggedlink "
    href="http://code.google.com/p/spyderlib/" >
        spyderlib -  Project Hosting on Google Code
    </a>
    suiteblablabla'''
     
    RE = '<a rel="nofollow"\r?\n'\
         +'class="taggedlink "\r?\n'\
         +'href=("http:.+?") >\r?\n'\
         +' *([^\r\n]+?)\r?\n</a>'
     
    pat = re.compile(RE)
     
    print pat.search(ch).groups()
     
    d.update((pat.search(ch).groups(),))
     
    print
    print 'd =',d
    ('"http://code.google.com/p/spyderlib/"', 'spyderlib - Project Hosting on Google Code')

    d = {'"http://code.google.com/p/spyderlib/"': 'spyderlib - Project Hosting on Google Code'}


    Au passage:
    merci pour la correction de mon écriture hideuse des chaînes que tu m’as conseillée il y a quelques jours. J’adopte la forme ’''.....’'' . Jusqu’à ta remarque je n’avais pas compris comment fonctionnait cette forme et son intérêt, et ne m’y étais jamais intéressé de près.

    Cependant ici pour la définition de RE, obligation d’utiliser celle que j’ai utilisée, parce que je veux spécifier un caractère ’\r’ optionnel devant le ’\n’, de façon à rendre le code apte à traiter un texte dans lequel il y aurait aussi bien ’\r\n’ que ’\n’ comme fin de ligne possible.

  4. #4
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Correctif

    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
     
    myDeliciousTag = {}
     
    ch = '''blablablalkjhkjjgdc
    <a rel="nofollow"
    class="taggedlink "
    href="http://code.google.com/p/spyderlib/" >
        spyderlib -  Project Hosting on Google Code
    </a>
    suiteblablabla'''
     
    RE = '<a rel="nofollow"\r?\n'\
         +'class="taggedlink "\r?\n'\
         +'href=("http:.+?") >\r?\n'\
         +' *([^\r\n]+?)\r?\n</a>'
     
    pat = re.compile(RE)
     
    u,v = pat.search(ch).groups()
     
    myDeliciousTag.update(((v,u),))
     
    print
    print 'myDeliciousTag =',myDeliciousTag

  5. #5
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci. Effectivement je cherchais tous les liens . J'avais oublié de le dire.

    Je ferais ce soir, car là je dois bosser, une version avec le module http qui ira sur le net chercher la page.

  6. #6
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Différence entre group() et groups():


    - groups()[0] n’est pas la chaîne matchante avec la totalité de la RE , comme c’est le cas pour group(0)
    groups()[0] est le premier groupe capturé

    - groups() ne permet pas de sélectionner plusieurs groupes. On peut écrire pat.search(ch).groups()[0] par exemple,
    mais pas pat.search(ch).groups()[0,1] et donc pas pat.search(ch).groups()[1,0]



    - group(0) équivaut à group() et renvoie la chaîne matchante totale c’est à dire matchant avec la RE dans son entier

    - Une RE qui capture 10 groupes permettra d’écrire
    pattern.search().group(2,5,1,10,9,6,7,9,2) par exemple (remarquer répétition de 2 et 9)
    Ici on utilise cette possibilité pour présenter à l’update un tuple dans l’ordre inverse de leur capture:
    pat.search(ch).group(2,1)



    J’ai remplacé la forme update((pat.search(ch).group(2,1),))
    par update([pat.search(ch).group(2,1)]) , moins étrange


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    RE = '<a rel="nofollow"\r?\n'\
         +'class="taggedlink "\r?\n'\
         +'href=("http:.+?") >\r?\n'\
         +' *([^\r\n]+?)\r?\n</a>'
     
    pat = re.compile(RE)
     
    print  pat.search(ch).group(2,1)
     
    myDeliciousTag.update([pat.search(ch).group(2,1)])
     
    print
    print 'myDeliciousTag =',myDeliciousTag

  7. #7
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Le cod suivant me renvoie : " u,v = pat.search(ch).groups() AttributeError: 'NoneType' object has no attribute 'groups' "
    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
    #!/usr/bin/env python
    #coding=utf-8
    import re
    ch = """<a rel="nofollow" class="taggedlink " href="http://forum.ubuntu-fr.org/" >Forum Ubuntu-fr.org</a>"""
     
    print ch
     
    RE = '<a rel="nofollow"\r?\n'\
         +'class="taggedlink "\r?\n'\
         +'href=("http:.+?") >\r?\n'\
         +' *([^\r\n]+?)\r?\n</a>'
     
    pat = re.compile(RE)
     
    u,v = pat.search(ch).groups()
     
    myDeliciousTag.update(((v,u),))
     
    print
    print 'myDeliciousTag =',myDeliciousTag

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonsoir,

    c'est que la donnée analysée ne correspond pas à l'expression régulière définie à cause des sauts de lignes.

    teste avec le pattern que je donne dans mon post en haut

  9. #9
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par kango Voir le message
    c'est que la donnée analysée ne correspond pas à l'expression régulière définie à cause des sauts de lignes.
    Où avais-je la tête ?...

    Voici un code fonctionnel :
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    # Source : http://www.developpez.net/forums/d861011/autres-langages/python-zope/general-python/recuperer-adresses-delicious
     
    import re
    import urllib
     
    url = 'http://delicious.com/projetmbc'
    content = urllib.urlopen(url).read().replace('\n',' ')
     
    RE = '<a rel="nofollow" class="taggedlink " href=("http:.+?") >*([^\r\n]+?)</a>'
    pat = re.compile(RE)
    groupsSearched = pat.search(content).groups()
     
    myDeliciousTag = {}
     
    while groupsSearched:
        u,v = groupsSearched
        myDeliciousTag.update(((v,u),))
     
        i = content.find(u)
     
        try:
            groupsSearched = pat.search(content[i:]).groups()
        except:
            groupsSearched = None
     
    import pprint
    prettyPrint = pprint.PrettyPrinter(indent = 1)
     
    print
    prettyPrint.pprint(myDeliciousTag)
    J'obtiens au jour d'aujourd'hui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {'DirSync Pro (Directory Synchronize Pro)': '"http://directorysync.sourceforge.net/"',
     'Processing.js': '"http://processingjs.org/"',
     'Python - Forum des professionnels en informatique': '"http://www.developpez.net/forums/f96/autres-langages/python-zope/"',
     'Quel est le titre de ce site ?': '"http://projetmbc.perso.neuf.fr/index.php"',
     'Site des Z\xc3\xa9ros': '"http://sitedeszeros.sdz.fr/"',
     'jQuery : Official': '"http://blog.jquery.com/"',
     'pyquery: a jquery-like library for python \xe2\x80\x94 pyquery v0.3 documentation': '"http://pyquery.org/"',
     'spyderlib -  Project Hosting on Google Code': '"http://code.google.com/p/spyderlib/"'}
    Merci pour les regex...

  10. #10
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Et en fonction de quels critères un lien est désirable ou non, c’est à dire quels sont les éléments autour d’un lien désirable qui permettent son repérage, avec la stabilité/variabilité de ces éléments.
    On y est




    J’espère que tu as vu pourquoi ce ch ne peut matcher avec la regex définie:
    comme le dit kango, il n’y a pas de fins de lignes dans ce ch, alors que les \n dans la RE définie en exigent

    Dans ce cas, on pourrait passer en mode MULTILINE de façon que le point puisse représenter tous les types de caractères = y compris les fins de ligne.

    Mais les deux chaîne à capturer sont tellement proches dans le texte, avec des caractères entre eux en si petit nombre mais malgré tout entachés d’une variabilité (\n ou pas? , whitespace ou pas?) que je pense préférable d’éviter le point en MULTILINE.



    D’où je propose ceci:

    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
    #!/usr/bin/env python
    #coding=utf-8
     
    import re
     
    ch = """<a rel="nofollow" class="taggedlink " href="http://forum.ubuntu-fr.org/" >Forum Ubuntu-fr.org</a>"""
     
     
    ch2 = '''<a rel="nofollow"
    class="taggedlink "
    href="http://code.google.com/p/spyderlib/" >
        spyderlib -  Project Hosting on Google Code
    </a>'''
     
    myDeliciousTag = {}
     
    RE = '<a rel="nofollow"[\s\r\n]+class="taggedlink "[\s\r\n]+href='\
         +'("http://.+?") >[\s\r\n]*(.+?)[\r\n]*</a>'
    pat = re.compile(RE)
     
    print 'repr(ch) :\n',repr(ch)
    print '\npat.search(ch).group(2,1) :\n',pat.search(ch).group(2,1)
    myDeliciousTag.update([pat.search(ch).group(2,1)])
    print '\nmyDeliciousTag =',myDeliciousTag
     
    print '\n\n\nrepr(ch2) :\n',repr(ch2)
    print '\npat.search(ch2).group(2,1) :\n',pat.search(ch2).group(2,1)
    myDeliciousTag.update([pat.search(ch2).group(2,1)])
    print '\nmyDeliciousTag =',myDeliciousTag
    repr(ch) :
    '<a rel="nofollow" class="taggedlink " href="http://forum.ubuntu-fr.org/" >Forum Ubuntu-fr.org</a>'

    pat.search(ch).group(2,1) :
    ('Forum Ubuntu-fr.org', '"http://forum.ubuntu-fr.org/"')

    myDeliciousTag = {'Forum Ubuntu-fr.org': '"http://forum.ubuntu-fr.org/"'}



    repr(ch2) :
    '<a rel="nofollow"\nclass="taggedlink "\nhref="http://code.google.com/p/spyderlib/" >\n spyderlib - Project Hosting on Google Code\n</a>'

    pat.search(ch2).group(2,1) :
    ('spyderlib - Project Hosting on Google Code', '"http://code.google.com/p/spyderlib/"')

    myDeliciousTag = {'Forum Ubuntu-fr.org': '"http://forum.ubuntu-fr.org/"', 'spyderlib - Project Hosting on Google Code': '"http://code.google.com/p/spyderlib/"'}


    Après le deuxième [\r\n\w] je mets une * parce que 'Forum Ubuntu-fr.org' suit immédiatement ’>’, tandis qu’il y aura toujours au moins un blanc avant ’class’ et avant ’href’

    J’ai réécrit la RE de façon que le précédent ch continue de matcher, évidemment.



    Il ne reste plus qu'à attendre le prochain bug pour cause de variabilité.



    EDIT:

    rambc, il me semble que tu n’as pas dû remarquer que j’avais ajouté un message #6 à midi qui évite l’écriture lourdingue de (u,v) pour intervertir les groupes.

  11. #11
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci pour tout. On arrive finalement au code suivant :
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    # Source : http://www.developpez.net/forums/d861011/autres-langages/python-zope/general-python/recuperer-adresses-delicious
     
    import re
    import urllib
     
    url = 'http://delicious.com/projetmbc'
    content = urllib.urlopen(url).read()
     
    RE = '<a[\s]+rel="nofollow"[\s\r\n]+class="taggedlink[\s]+"[\s\r\n]+href=("http://.+?")[\s]+>[\s\r\n]*(.+?)[\r\n]*</a>'
    pat = re.compile(RE)
    groupsSearched = pat.search(content).group(2,1)
     
    myDeliciousTag = {}
     
    while groupsSearched:
        myDeliciousTag.update([groupsSearched])
     
        i = content.find(groupsSearched[1])
     
        try:
            groupsSearched = pat.search(content[i:]).group(2,1) #pat.search(content[i:]).groups()
        except:
            groupsSearched = None
     
    import pprint
    prettyPrint = pprint.PrettyPrinter(indent = 1)
     
    print
    prettyPrint.pprint(myDeliciousTag)

  12. #12
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    OK

    Mais je continue de regarder. Il y a des choses qui me paraissaient obscures dans ton précédent.

    Il faut que j’arrive à comprendre ce qui se passe dans ce nouveau code

    À +

  13. #13
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Il y a des choses qui me paraissaient obscures dans ton précédent.
    Tu penses à quoi....

  14. #14
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Je me doutais bien qu’il y avait un lézard.
    Quelles les contorsions tu fais pour arriver à attraper tous les matches dans la page !

    Tu initialises groupsSearched par
    groupsSearched = pat.search(content).group(2,1)
    de façon à pouvoir lancer une boucle while.
    Puis dans la boucle , tu recherches l’index du premier caractère de l’adresse qui se trouve dans groupsSearched, caractère qui se trouve obligatoirement après ’<a rel="nofollow"...’ , ce qui te permet de relancer groupsSearched = pat.search(content).group(2,1)
    pour trouver le match suivant.



    Tu n’as jamais dû avoir le temps de potasser les regex.
    Parce qu’il y a deux fonctions toutes prêtes pour attraper tous les matches dans un texte, et pas un seul:


    - findall()
    produit une liste des tuples groups() de tous les matches qui existent dans la chaîne explorée.

    Une fois établie cette liste , on ne peut pas rechercher des données paticulières associées aux matches, comme le début et la fin du match. De plus les tuples enregistrés dans la liste renvoyée par findall() comportent nécessairement tous les groupes dans un ordre fixe, sans possibilité de sélectionner certains groupes, et encore moins de pouvoir le faire de façon différenciée d’un match à l’autre.


    - finditer()
    produit un itérateur sur l’ensemble des MatchObjects trouvés dans le parcours de la chaîne explorée.

    Cet itérateur est éminemment pratique puisqu’il permet de débiter les MatchObjects au compte goutte , donnant ainsi la possibilité de manipuler chaque MatchObject pour en tirer ce qui nous arrange: sélection de groupes, extraction de m.end() , m.start() , m.span() et des valeurs attributs du MatchObject comme pos , endpos , etc. Possibilité même de faire plusieurs différentes de ces opérations, de les répéter, de faire jouer un véritable algorithme sur chaque MatchObject, en définitive.





    Comme on veut inverser les deux groupes trouvés dans chaque match, findall() n’est pas adaptée à ce qu’on veut faire.

    Avec finditer() , on peut faire
    - soit une boucle for
    - soit une list comprehension
    - soit un générateur

    Et comme la fonction update du dictionnaire accepte un iterable, son remplissage prend une ligne avec un générateur !





    Par ailleurs, j’ai affiché le code source de la page web analysée pour l’examiner.

    Il est clair que les motifs dans lesquels se trouvent les adresses et commentaires que tu recherches ne sont en fait pas sur plusieurs lignes, contrairement à la chaîne avec des \n que tu as présentée dans le message #1.

    Je pense qu’il est donc inutile de se trainer une RE comportant des \r et des \n et qu’il faut la réécrire en l’optimisant.

    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
    #!/usr/bin/env python
    #coding=utf-8
     
    import re,urllib
    url = 'http://delicious.com/projetmbc'
    content = urllib.urlopen(url).read()
    pat = re.compile('<a\s+rel="nofollow"\s+class="taggedlink[\s"]+'\
    +'href=("http://[^"]+")[\s>]+([^<]+)</a>')
     
    myDeliciousTag = {}
    myDeliciousTag.update(m.group(2,1) for m in pat.finditer(content) )
     
    import pprint
    prettyPrint = pprint.PrettyPrinter(indent = 1)
    print
    prettyPrint.pprint(myDeliciousTag)




    Enfin, comme il s’agit d’une page sur laquelle tu as le contrôle:

    1) je pense que le cas où il y a plusieurs blancs devant une clé de ton dictionnaire comme dans la chaîne que tu as présentée dans message #1 n’existe pas, ou tu dois faire en sorte qu’il n’existe pas.
    Je parle de
    "http://code.google.com/p/spyderlib/" >
    ....spyderlib - Project Hosting on Google Code
    plusieurs blancs devant le 2ième spyderlib.

    2) le blanc avant dans "taggedlink " est inutile et pesant. Il faudrait que tu l’élimines. Je penses que c'est toi qui as décidé de ce blanc et pas un créateur de texte.

    Ces deux mesures permettraient de simplifier la RE.
    Pour le moment j’ai feinté avec [\s"]+ à deux endroits, pour résoudre ces chicanes sans intérêt, mais ce n’est pas satisfaisant.

  15. #15
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Bravo pour la concision de ton code !

    Citation Envoyé par eyquem Voir le message
    Tu n’as jamais dû avoir le temps de potasser les regex.
    Me voilà démasqué... Dans la mesure où je n'ai pas eu pour le moment l'obligation de les utiliser, je n'ai pas mis le nez dedans.

    Citation Envoyé par eyquem Voir le message
    1) je pense que le cas où il y a plusieurs blancs devant une clé de ton dictionnaire comme dans la chaîne que tu as présentée dans message #1 n’existe pas, ou tu dois faire en sorte qu’il n’existe pas.
    Je pense que pour le coup c'est le boulot du script. Tant pis si je fais des fautes de frappe...

    Citation Envoyé par eyquem Voir le message
    2) le blanc avant dans "taggedlink " est inutile et pesant. Il faudrait que tu l’élimines. Je penses que c'est toi qui as décidé de ce blanc et pas un créateur de texte.
    Non je n'ai rien paramétré. Les standards HTML sont un peu malmenés quelques fois...

    Sinon j'ai fait corrigé "mon" précédent code pour obtenir le suivant :
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    # WARNING ! This script does not work with Python 3.
    # Source : http://www.developpez.net/forums/d861011/autres-langages/python-zope/general-python/recuperer-adresses-delicious
     
    import re
    import urllib
     
    url = 'http://delicious.com/projetmbc'
    content = urllib.urlopen(url).read()
     
    RE = '<a[\s]+rel="nofollow"[\s\r\n]+class="taggedlink[\s]+"[\s\r\n]+href=("http://.+?")[\s]+>[\s\r\n]*(.+?)[\r\n]*</a>'
    pat = re.compile(RE)
    groupsSearched = pat.findall(content)
     
    myDeliciousTag = {}
     
    for oneGroup in groupsSearched:
        oneGroup = list(oneGroup)
        oneGroup.reverse()
        myDeliciousTag.update([oneGroup])
     
    import pprint
    prettyPrint = pprint.PrettyPrinter(indent = 1)
     
    print
    prettyPrint.pprint(myDeliciousTag)

  16. #16
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par eyquem Voir le message
    je pense que le cas où il y a plusieurs blancs devant une clé de ton dictionnaire comme dans la chaîne que tu as présentée dans message #1 n’existe pas, ou tu dois faire en sorte qu’il n’existe pas.
    Je parle de
    "http://code.google.com/p/spyderlib/" >
    ....spyderlib - Project Hosting on Google Code
    plusieurs blancs devant le 2ième spyderlib.
    Je viens de vérifier pour spyder et j'ai bien tapé "spyderlib - Project Hosting on Google Code" dans le nom du marque page... Pour le code source j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a rel="nofollow" class="taggedlink " href="http://code.google.com/p/spyderlib/" >spyderlib -  Project Hosting on Google Code</a>
    De plus je n'ai pas tous les tags...

  17. #17
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Bravo pour la concision de ton code !
    Bravo à Python surtout. Je ne fais que l’utiliser de façon correcte, il n’y a aucun mérite particulier.



    Je pense que pour le coup c'est le boulot du script. Tant pis si je fais des fautes de frappe...
    Comprends pas.

    Ça m’amène à une question. Ce code est-il destiné à t’être un outil te permettant d’analyser pour vérification un code source en cours d’élaboration ?
    Ou pour extraire des informations d’un code censé être correct ?





    Non je n'ai rien paramétré. Les standards HTML sont un peu malmenés quelques fois...
    Tu veux dire que c’est un écriveur de code HTML (je ne sais pas quel est le terme correct) qui est responsable de ce blanc dans "taggedlink " ? Il n’est pas possible de l’empêcher ? Quelles sont son utilité et son obligation ?





    Sinon j'ai fait corrigé "mon" précédent code pour obtenir le suivant :
    Et?......

  18. #18
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Je ne suis pas responsable du code myDelicious. Souvent sur le net, les codes HTML ne respectent pas tous les standards...

    Je ne comprends pas pourquoi il me manque des tags... Cela vient de url qui me renvoit pas la bonne page...

  19. #19
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Qu’est ce que tu entends par « il me manque des tags » ?

  20. #20
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    J'ai repéré le problème. Voici un correctif qui prend en compte plusieurs pages (quand on utilise urllib, on tombe sur la mise en page par défaut qui contient juste 10 tags et non 25 comme je l'avais configuré sur mon ordi.) :
    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
    #!/usr/bin/env python
    #coding=utf-8
     
    import re
    import urllib
     
    url = 'http://delicious.com/projetmbc'
     
    pat = re.compile('<a\s+rel="nofollow"\s+class="taggedlink[\s"]+'\
    +'href=("http://[^"]+")[\s>]+([^<]+)</a>')
     
    myDeliciousTag = {}
    url = url + '/?page='
     
    nbPage = 0
    oneTagFound = True
     
    while oneTagFound:
        nbPage += 1
        urlNb = url + str(nbPage)
     
        content = urllib.urlopen(urlNb).read().strip()
     
        oneTagFound = False
        for m in pat.finditer(content):
            if m.group(2,1):
                oneTagFound = True
                myDeliciousTag.update([m.group(2,1)])
     
     
    import pprint
    prettyPrint = pprint.PrettyPrinter(indent = 2)
    print str(nbPage - 1) + ' page(s) opened.'
    print
    prettyPrint.pprint(myDeliciousTag)
    Un grand merci à equyem.

    PS : ma façon de déterminer si la regex a été trouvée n'est peut-être pas la meilleure. Toute info est la bienvenue.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Récupérer des Informations sur un PC via un Réseau ?
    Par MaTHieU_ dans le forum Administration
    Réponses: 6
    Dernier message: 22/11/2005, 12h39
  2. Récupérer des données sur une page HTML
    Par rupeni dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 18/11/2005, 17h22
  3. [servlet] Récupérer des infos sur le client
    Par kenito dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 07/09/2005, 18h08
  4. Récupérer des infos sur un AVI
    Par FredericB dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/12/2003, 14h25
  5. Réponses: 6
    Dernier message: 28/09/2003, 17h49

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