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 :

Extraction de données dans un doc xhtml


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Par défaut Extraction de données dans un doc xhtml
    Bonjour,

    Je souhaiterais a partir d"une page xhtml qui contient des liens vers tout un tas de package, écrire un script python qui me permette de construire une liste triée de la forme

    NOM_PACKAGE_1 URL_PACKAGE_1.
    NOM_PACKAGE_2 URL_PACKAGE_2

    Par exemple mon xhtml ressemble a ca :

    dload filename { url: 'http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-4.4.0-src.tar.bz2' }"
    href="/projects/mingw/files/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-4.4.0-src.tar.bz2/download"
    title="/GCC Version 4/Current Release_ gcc-4.4.0/gcc-4.4.0-src.tar.bz2: released on 2009-06-23"
    >gcc-4.4.0-src.tar.bz2</a>

    </td>
    <td class="platform">


    </td>
    <td>62.7 MB</td>
    <td>2009-06-23</td>
    <td>3,274</td>
    <td>

    <a href="http://sourceforge.net/project/shownotes.php?release_id=691876" class="icon-sm notes-sm" title="Release Notes">Release Notes</a>

    </td>

    </tr>

    <tr id="node-775-2" class="child-of-node-753-1">

    <td class="tree">
    <a class="




    ext_jar

    dload filename { url: 'http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/ecj-20080701-src.jar' }"
    href="/projects/mingw/files/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/ecj-20080701-src.jar/download"
    title="/GCC Version 4/Current Release_ gcc-4.4.0/ecj-20080701-src.jar: released on 2009-06-23"
    >ecj-20080701-src.jar</a>

    et je veux obtenir :

    ecj-20080701-src.jar http://downloads.sourceforge.net/pro...080701-src.jar
    gcc-4.4.0-src.tar.bz2 http://downloads.sourceforge.net/pro....0-src.tar.bz2


    ca implique de détecter dload filename { url:'URL_PACKAGE' }"
    et d'extraire URL_PACKAGE puis ensuite d'aller jusqu'au
    >NOM_PACKAGE<.

    Si vous savez faire ca faites moi signes...

    L'idée est de pouvoir lister les packages disponibles au téléchargement sur le site http://sourceforge.net/projects/mingw/files/.

    Rémunération possible par paypal ou rentacoder ...

  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
    Bonsoir,


    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
    import urllib,re
     
    sock = urllib.urlopen('http://sourceforge.net/projects/mingw/files/')
    ch = sock.read()
    sock.close()
     
    pat = re.compile('(?<=dload filename { url)'
                     ": '(http://downloads.sourceforge.net/"
                     'project/mingw/GCC%20Version%204/'
                     'Current%20Release_%20gcc-4.4.0/'
                     "(.+?))'")
     
    liens = pat.findall(ch)
     
    print ('\n'+16*'-----'+'\n').join( v+'\n\n'+u for u,v in liens )


    Résultat:

    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
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    >>> 
    gcc-java-4.4.0-mingw32-bin-2.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-java-4.4.0-mingw32-bin-2.tar.gz
    --------------------------------------------------------------------------------
    gcc-full-4.4.0-mingw32-bin-2.tar.lzma
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-full-4.4.0-mingw32-bin-2.tar.lzma
    --------------------------------------------------------------------------------
    gcc-4.4.0-mingw32-src-2.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-4.4.0-mingw32-src-2.tar.gz
    --------------------------------------------------------------------------------
    pthreads-w32-2-8-0-src.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/pthreads-w32-2-8-0-src.tar.gz
    --------------------------------------------------------------------------------
    mpfr-2.4.1-src.tar.lzma
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/mpfr-2.4.1-src.tar.lzma
    --------------------------------------------------------------------------------
    gmp-4.2.4-src.tar.bz2
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gmp-4.2.4-src.tar.bz2
    --------------------------------------------------------------------------------
    gcc-4.4.0-src.tar.bz2
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-4.4.0-src.tar.bz2
    --------------------------------------------------------------------------------
    ecj-20080701-src.jar
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/ecj-20080701-src.jar
    --------------------------------------------------------------------------------
    pthreads-w32-2.8.0-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/pthreads-w32-2.8.0-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    mpfr-2.4.1-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/mpfr-2.4.1-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gmp-4.2.4-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gmp-4.2.4-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gcc-4.4.0-mingw32-notes.txt
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-4.4.0-mingw32-notes.txt
    --------------------------------------------------------------------------------
    gcc-objc-4.4.0-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-objc-4.4.0-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gcc-objc-4.4.0-mingw32-bin.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-objc-4.4.0-mingw32-bin.tar.gz
    --------------------------------------------------------------------------------
    gcc-java-4.4.0-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-java-4.4.0-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gcc-fortran-4.4.0-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-fortran-4.4.0-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gcc-fortran-4.4.0-mingw32-bin.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-fortran-4.4.0-mingw32-bin.tar.gz
    --------------------------------------------------------------------------------
    gcc-core-4.4.0-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-core-4.4.0-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gcc-core-4.4.0-mingw32-bin.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-core-4.4.0-mingw32-bin.tar.gz
    --------------------------------------------------------------------------------
    gcc-c%2B%2B-4.4.0-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-c%2B%2B-4.4.0-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gcc-c%2B%2B-4.4.0-mingw32-bin.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-c%2B%2B-4.4.0-mingw32-bin.tar.gz
    --------------------------------------------------------------------------------
    gcc-ada-4.4.0-mingw32-dll.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-ada-4.4.0-mingw32-dll.tar.gz
    --------------------------------------------------------------------------------
    gcc-ada-4.4.0-mingw32-bin.tar.gz
     
    http://downloads.sourceforge.net/project/mingw/GCC%20Version%204/Current%20Release_%20gcc-4.4.0/gcc-ada-4.4.0-mingw32-bin.tar.gz
    >>>





    Pourquoi est-ce que je mets (?<=dload filename { url) en tête de la RE au lieu de simplement dload filename { url ?



    Parce que j’ai déterminé les nombres d’occurences des caractères situés avant le premier dload filename et les nombres d’occurences des caractéres situés dans l’ensemble de la page par le programme 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
    import urllib,re
    from operator import itemgetter
    from collections import defaultdict
     
    sock = urllib.urlopen('http://sourceforge.net/projects/mingw/files/')
    ch = sock.read()
    sock.close()
     
    d = defaultdict(int)
     
    x = ch .find('dload filename')
    for c in ch[0:x]:  d[c]+=1
    lid = d.items()
    lid.sort(key=itemgetter(1))
    print '\n'.join( repr(u)+'\t'+str(v) for u,v in lid )
    del d
     
    print '\n==================================\n'
     
    d = defaultdict(int)
     
    for c in ch:  d[c]+=1
    lid = d.items()
    lid.sort(key=itemgetter(1))
    print '\n'.join( repr(u)+'\t'+str(v) for u,v in lid )


    Il en ressort que ’:’ apparaît un nombre limité de fois:
    26 fois avant le premier dload filename
    2984 fois sur l’ensemble du texte

    Alors que pour ’d’ par exemple:
    331 fois avant le premier dload filename
    29587 dans toute la page

    Pour ’h’ c’est
    161 et
    7205.

    etc



    On peut donc s’attendre que faire chercher au moteur de regex la lettre ’d’ comme premier caractère de la chaîne recherchée serait plus long que de lui donner à réagir sur le caractère ’:’ puisqu’il devrait s’arrêter plus souvent sur un ’d’ , afin de vérifier s’il est suivi du reste de la RE , que de s’arrêter sur un ’:’



    Comme il y a des ’:’ ailleurs que dans la portion
    http://downloads.sourceforge.net
    il faut un moyen de repérer le bon.

    Avec (?<=dload filename { url) , le moteur de regex vérifie si ’:’ est précédé de dload filename { url chaque fois qu’il rencontre un ’:’ et uniquement quand il en rencontre un. C’est toujours moins fréquent pour lui que de chercher dload filename { url tout le long du texte.




    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
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
     
    >>> 
    'K'	1
    'Q'	1
    'Y'	1
    'X'	2
    '#'	3
    '*'	3
    'V'	3
    '$'	4
    'L'	4
    '7'	4
    'H'	5
    'P'	5
    '|'	5
    'q'	6
    'R'	7
    'O'	8
    '&'	8
    '4'	9
    '?'	9
    '['	9
    '{'	9
    'I'	9
    ']'	9
    '}'	9
    '5'	10
    'A'	10
    'z'	11
    '8'	12
    '%'	14
    'E'	14
    'U'	14
    '9'	15
    'k'	16
    'B'	16
    '3'	19
    'F'	19
    'D'	20
    'N'	20
    '!'	21
    '6'	24
    'T'	25
    '+'	26
    ':'	26
    'W'	27
    '1'	27
    'S'	28
    'M'	29
    'G'	30
    ','	34
    '('	36
    'C'	36
    ')'	36
    'x'	38
    '2'	39
    '\t'	40
    'j'	50
    'y'	52
    '0'	67
    'b'	76
    '_'	79
    ';'	85
    "'"	87
    'w'	93
    '.'	95
    'g'	105
    'v'	115
    'm'	130
    'f'	137
    '-'	138
    'u'	149
    'h'	161
    '='	208
    '>'	236
    '<'	237
    '/'	265
    'c'	268
    'p'	273
    'l'	274
    '"'	283
    'n'	303
    'd'	331
    'o'	382
    '\n'	387
    'r'	398
    's'	420
    'a'	449
    'i'	450
    't'	523
    'e'	568
    ' '	3252
     
    ==================================
     
    '@'	2
    'X'	2
    'J'	2
    '#'	3
    '*'	3
    '|'	5
    'Q'	5
    '$'	10
    'q'	12
    '['	15
    ']'	15
    '&'	23
    '!'	37
    'H'	41
    '\t'	53
    '('	58
    ')'	58
    'I'	97
    '+'	122
    ';'	134
    'D'	280
    'U'	475
    '?'	585
    'V'	687
    'K'	724
    ','	756
    'F'	799
    '{'	893
    '}'	893
    'A'	900
    'P'	923
    'L'	932
    'O'	1066
    'T'	1212
    'W'	1327
    'C'	1357
    'B'	1569
    'Y'	1781
    "'"	1877
    'G'	2039
    'k'	2206
    'v'	2402
    'x'	2445
    'N'	2565
    'y'	2785
    '_'	2864
    ':'	2984
    'R'	3139
    'E'	3335
    'j'	3348
    '6'	3480
    'M'	3537
    '8'	3686
    '7'	4039
    'z'	4321
    '%'	4504
    'b'	4836
    '5'	5085
    '4'	5232
    '9'	5758
    'S'	6061
    'u'	6679
    'h'	7205
    '3'	7906
    'w'	8508
    'p'	9654
    'g'	10613
    'f'	11261
    '='	11440
    'm'	15109
    'c'	18535
    '2'	19154
    '0'	19906
    '<'	20853
    '>'	20853
    'n'	20998
    '1'	21142
    '"'	21538
    'r'	24694
    '.'	26124
    'o'	26960
    'i'	27367
    'a'	28486
    'l'	28505
    'd'	29587
    '\n'	32390
    '/'	33953
    '-'	35763
    's'	36236
    't'	44201
    'e'	45350
    ' '	870255
    >>>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Par défaut
    Waou la il est tard donc je n'ai pas le temps d'analyser tout le code mais j'ai rarement vu une réponse aussi complète et expliqué.
    Un grand merci pour avoir pris de ton temps pour rédiger cette réponse.
    Ca fait plaisir!

    UPDATE: je viens de lire tout le message finalement et une petite correction, en fait je voulais TOUS les packages disponibles (pas seulement commencant par gcc) a partir de la section All Files car sinon on aura des doublons.
    Et enfin je voudrais que la liste soit triée par ordre alphabétique :

    aaaa-mingw32-1.0 http://....
    bbbb-msys-1.0 http://....
    less-436-1-msys.RELEASE_NOTES http://...
    zzzzz-mingw32 http://...

    Mais a partir des infos que vous donnez je devrais pouvoir adapter et faire quelque chose.

    Autre question: est ce que vous maitrisez aussi bien les scripts shells, sed et awk ?

  4. #4
    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
    en fait je voulais TOUS les packages disponibles (pas seulement commencant par gcc)
    Mais il y sont bien tous, non ?
    Les 4,5 et 6 ièmes sont
    pthreads-w32-2-8-0-src.tar.gz
    mpfr-2.4.1-src.tar.lzma
    gmp-4.2.4-src.tar.bz2
    par exemple.





    La modif suivante fera ton affaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    x = ch.find('All Files')
    x = x + ch[x:].find('dload filename { url')
    y = ch.rfind('dload filename { url') + 500
    liens = [ m.group(2,1) for m in pat.finditer(ch[x:y]) ]
    liens.sort()
     
    print ('\n'+16*'-----'+'\n').join( '\n\n'.join(el) for el in liens )


    liens est une liste de doublets
    Pour avoir les doublets dans le bon ordre, j’inverse les chaînes attrapées par les deux groupes.
    Pour cela , un petit group(2,1) et hop. Ce qui oblige à abandonner findall() et à utiliser finditer()
    J’attire ton attention sur l’éminente utilité de finditer() en général.


    sort() trie une liste.
    Sur une liste de doublets, elle trie d’après les premiers éléments des doublets.
    C’est pour cela que je préfère inverser les deux chaînes matchées dans chaque match.
    Sinon, on aurait dû trier par liens.sort(key=itemgetter(1)) [ 0 étant le premier élément, 1 est le second]
    Et itemgetter() doit être importée. Là pas besoin d’importer

    Remarquer aussi l’écriture différente '\n\n'.join(el) for el in liens puisque el est maintenant un doublet dans le bon ordre.







    Pour éviter de lister les liens des “Newest Files“ , il suffit de faire chercher la regex après les mots “All Files“ en déterminant la position x de ces mots dans le texte:
    x = ch.find('All Files')

    La valeur de ce x = ch.find('All Files') , c’est à dire la position du caractères ’A’ de “All Files“ dans le texte est 10649.
    Avant ce x il y a 26 fois le caractère ’:’.

    Heureusement, il n’y a pas d’autre expression “All Files“ dans le texte. Il y a seulement “all files“ dans la définition du bouton “View all files“, mais Python distingue les majuscules des minuscules.



    x = x + ch[x:].find('dload filename { url')
    La valeur de ce nouvel x , c’est à dire la position du premier 'dload filename { url' situé après “All Files“ est 22287.
    Avant ce 2ième x, il y a 41 fois le caractère ’:’.

    Cela présente donc un intérêt de calculer ce 2ième x car on peut faire démarrer la recherche par la regex deux fois plus loin dans le texte et en évitant 2 fois plus de caractères ’:’



    Il faut bien voir que l’intérêt est d’ailleurs double:

    - en faisant commencer la recherche à 22287 au lieu de 10649, on évite au moteur de regex 2 fois plus de caractères sur chacun desquels il doit rechercher s’il est égal à ’:’

    - on divise aussi par 2 le nombre d’occurences de ’:’ sur lesquelles il doit s’arrêter pour examiner si elles sont suivies de la suite de la RE, à savoir ’ ' h ttp ://downloads.sourceforge.net/project/mingw/GCC...etc’ (j'ai mis deux blancs pour que ca ne mette pas en lien)

    Du moins est-ce ainsi que je comprends le fonctionnement d’un moteur de regex

    La regex saute donc à une position optimisée pour commencer sa recherche.




    De même, faire arrêter la recherche à y = ch.rfind('dload filename { url') + 500
    évite 6849 caractères et 36 ’:’
    Ce n’est pas énorme mais c’est toujours ça.
    Le 500 qui est ajouté, c’est pour aller bien au delà de la fin du dernier lien qui doit être attrapé, ces liens ayant en gros une longueur de 150 caractères.



    Ce fignolage est justifié par le fait que la fonction find() trouve les motifs à une vitesse extrêmement élevée. Sinon on perdrait plus de temps à chercher les x et y qu’on en gagnerait à éviter des plages de caractères au moteur de regex.












    Je ne connais pas du tout shell et awk.
    J’ai étudié un peu sed qui me semble très intéressant mais je ne sais pas l’utiliser.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Mais il y sont bien tous, non ?
    Les 4,5 et 6 ièmes sont
    pthreads-w32-2-8-0-src.tar.gz
    mpfr-2.4.1-src.tar.lzma
    gmp-4.2.4-src.tar.bz2
    par exemple.
    Heu nan, ils n'y a que les packages en relation avec gcc. Par exemple il n'y a pas bash, xz, less, ...
    Mais c'est normal vu que la RE ne prends que des expressions avec GCC%20Version%204/ ...

    En fait il suffirait de matcher seulement url: 'http://downloads.sourceforge.net'
    J'ai essayé de modifier le code comme ca :

    pat = re.compile('(?<=dload filename { url)'
    ": '(http://downloads.sourceforge.net/"
    "(.+?))'")

    mais du coup j'obtiens :

    project/mingw/MSYS%20xz/xz-4.999.8beta_20090725git-1/xz-4.999.8beta_20090725git-1-msys-1.0.11-bin.tar.gz
    http ://downloads.sourceforge.net/project/mingw/MSYS%20xz/xz-4.999.8beta_20090725git-1/xz-4.999.8beta_20090725git-1-msys-1.0.11-bin.tar.gz

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 15
    Par défaut
    Citation Envoyé par smartmobili Voir le message
    Heu nan, ils n'y a que les packages en relation avec gcc. Par exemple il n'y a pas bash, xz, less, ...
    Mais c'est normal vu que la RE ne prends que des expressions avec GCC%20Version%204/ ...

    En fait il suffirait de matcher seulement url: 'http://downloads.sourceforge.net'
    J'ai essayé de modifier le code comme ca :

    pat = re.compile('(?<=dload filename { url)'
    ": '(http://downloads.sourceforge.net/"
    "(.+?))'")

    mais du coup j'obtiens :

    project/mingw/MSYS%20xz/xz-4.999.8beta_20090725git-1/xz-4.999.8beta_20090725git-1-msys-1.0.11-bin.tar.gz
    http ://downloads.sourceforge.net/project/mingw/MSYS%20xz/xz-4.999.8beta_20090725git-1/xz-4.999.8beta_20090725git-1-msys-1.0.11-bin.tar.gz
    Bon finalement j'obtiens ca :

    def munge(pair):
    p1, p2 = pair
    return (p1.rsplit('/', 1)[1], p2)

    sock = urllib.urlopen('http://sourceforge.net/projects/mingw/files/')
    ch = sock.read()
    sock.close()

    pat = re.compile('(?<=dload filename { url)'
    ": '(http://downloads.sourceforge.net/"
    'project/mingw/'
    "(.+?))'")


    x = ch.find('All Files')
    x = x + ch[x:].find('dload filename { url')
    y = ch.rfind('dload filename { url') + 500
    liens = [ m.group(2,1) for m in pat.finditer(ch[x:y]) ]

    print('\n'.join(munge(liens[0])))
    for el in liens[1:]:
    print(16*'-----'+'\n%s' % '\n'.join(munge(el)))

    Mais j'ai un dernier problème car les noms de packages sont parfois encodés cad qu'au lieu de g++ j'ai des trucs du genre g%20%20.
    Normalement il faudrait appeler urllib.unquote mais je n'arrive pas a l'ajouter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. extraction de données dans excel
    Par massilia80 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/10/2006, 12h14
  2. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  3. extraction des données dans une table Access
    Par moabomotal dans le forum Access
    Réponses: 2
    Dernier message: 26/05/2006, 11h17
  4. Extraction de donnés dans un fichier XML
    Par ANISSS dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 27/01/2006, 13h16
  5. insérer donnée dans un doc. word.
    Par roots_man dans le forum ASP
    Réponses: 5
    Dernier message: 20/12/2004, 13h09

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