2017-10-18 17 views
1

Ok, j'utilise donc un script qui télécharge des fichiers à partir d'URL répertoriées dans un fichier urls.txt.Analyse du nom de fichier à partir de la liste des liens d'URL

import urllib.request 

with open("urls.txt", "r") as file: 
    linkList = file.readlines() 
for link in linkList: 
    urllib.request.urlretrieve(link) 

Malheureusement, ils sont enregistrés sous forme de fichiers temporaires en raison de l'absence de deuxième argument dans ma fonction urllib.request.urlretrieve. Comme il y a des milliers de liens dans mon fichier texte, les nommer séparément n'est pas une option. La chose est que le nom du fichier est contenu dans ces liens, à savoir /DocumentXML2XLSDownload.vm?firsttime=true & repengback = true & d ocumentId = XXXXX & xsl = FileName rher2xml.xs l & outputFileName = XXX X_2017_06_25_4 .xls où le nom du fichier vient après outputFileName =

Existe-t-il un moyen facile d'analyser les noms de fichiers, puis les utiliser dans la fonction urllib.request.urlretrieve comme argument secondaire? Je pensais à extraire ces noms dans Excel et à les placer dans un autre fichier texte qui serait lu de la même manière que urls.txt mais je ne suis pas sûr de savoir comment l'implémenter en Python. Ou y a-t-il un moyen de le faire exclusivement en python sans utiliser Excel?

Répondre

1

Vous pouvez analyser le lien sur la route.

Exemple avec un regular expression:

import re 

with open("urls.txt", "r") as file: 
    linkList = file.readlines() 
for link in linkList: 
    regexp = '((?<=\?outputFileName=)|(?<=\&outputFileName=))[^&]+' 
    match = re.search(regexp, link.rstrip()) 

    if match is None: 
     # Make the user aware that something went wrong, e.g. raise exception 
     # and/or just print something 
     print("WARNING: Couldn't find file name in link [" + link + "]. Skipping...") 
    else: 
     file_name = match.group(0) 
     urllib.request.urlretrieve(link, file_name) 
+0

Il semble que cette méthode renvoie le nom de fichier <_sre.SRE_Match object; span = (156, 178), match = 'XXXX_2017_06_25_4.xls \ n'> comme je l'ai TypeError: fichier invalide: – Seidhe

+0

@Seidhe Mon mauvais, ça devrait marcher maintenant. Pourriez-vous réessayer? – GBlomqvist

+0

Il semble qu'il y ait une parenthèse fermante dans l'impression. Autre que je reçois ce genre d'erreur: retraçage (le plus récent appel dernier): Fichier "H: \ Mes Documents \ PYTHON \ download.py", ligne 8, dans file_name = re.search (regexp , link) .group (0) Fichier "F: \ TOO \ Team \ Logiciel \ Anaconda3 \ lib \ re.py", ligne 173, dans la recherche return _compile (pattern, flags) .search (string) File " F: \ TOO \ équipe \ Software \ Anaconda3 \ lib \ re.py », ligne 293, dans _compile p = sre_compile.compile (modèle, drapeaux) sre_constants.error: non terminée à la position 47 fixé – Seidhe

1

Vous pouvez utiliser urlparse et parse_qs pour obtenir la chaîne de requête

from urlparse import urlparse,parse_qs 
parse = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html?name=Python&version=2') 
print(parse_qs(parse.query)['name'][0]) # prints Python 
+0

Si je comprends qu'il crée un dictionnaire de chaînes qui viennent après le nom = et avant & Comme je suis complètement nouveau sur le Python, pourriez-vous me montrer à quoi cela devrait ressembler dans mon code? – Seidhe

+0

urlparse requête va retourner la chaîne de requête sur ce que nous divisons par & et créer dict qui signifie http://www.test.com/print?name=test&x=12345&y=12345678 va créer un dictionnaire comme '{'name' : 'test', 'x': '12345', 'y': '12345678'} '' – chakri

+0

Veuillez ne pas réinventer le fichier stdlib. Le module 'urlparse' inclut également la méthode' parse_qs' pour analyser les chaînes de requête et renvoyer un dict. Votre compréhension de dict devrait simplifier 'query_param_dict = parse_qs (parse.query)'. – PaulMcG