2017-10-18 145 views
1

好的,我使用的脚本是从urls.txt中列出的URL下载文件。解析URL链接列表中的文件名

import urllib.request 

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

不幸的是,他们被保存为临时文件,由于缺乏在我urllib.request.urlretrieve函数的第二个参数。由于我的文本文件中有数千个链接,因此不能单独命名它们。问题是,该文件的名称包含在这些链接,即/DocumentXML2XLSDownload.vm?firsttime=true & repengback =真& d ocumentId = XXXXXX & XSL文件名= rher2xml.xs升& outputFileName = XXX X_2017_06_25_4 .xls文件的名称在outputFileName =

有没有简单的方法来解析文件名,然后在urllib.request.urlretrieve函数中使用它们作为第二参数?我正在考虑在excel中提取这些名称,并将它们放在另一个文本文件中,该文件将以与urls.txt类似的方式读取,但我不确定如何在Python中实现它。或者有没有一种方法可以在不使用excel的情况下使用python?

回答

1

您可以解析在旅途中的链接。

例如使用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

看来这个方法返回file_name <_sre.SRE_Match对象; span =(156,178),match ='XXXX_2017_06_25_4.xls \ n'>因为我得到TypeError:无效的文件: – Seidhe

+0

@Seidhe我的不好,它现在应该工作。你能再试一次吗? – GBlomqvist

+0

看起来应该在印刷品中有左括号。除此之外,我得到这样的错误: 回溯(最近通话最后一个): 文件 “H:\我的文档\ PYTHON \ download.py”,8号线,在 FILE_NAME = re.search(正则表达式,链接).group(0) 文件“F:\ TOO \ Team \ Software \ Anaconda3 \ lib \ re.py”,行173,搜索 return _compile(pattern,flags).search(string) File“ F:\ TOO \ Team \ Software \ Anaconda3 \ lib \ re.py“,行293,in _compile p = sre_compile.compile(pattern,flags) sre_constants.error:未终止的字符集位置47 – Seidhe

1

您可以使用和里urlparse向parse_qs得到查询字符串

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

据我了解创建名称后都串的字典=之前和?因为我对Python完全陌生,请告诉我它应该在我的代码中看起来如何? – Seidhe

+0

urlparse查询将返回我们通过&拆分的查询字符串,并创建字典,这意味着http://www.test.com/print?name=test&x=12345&y=12345678将创建字典为 '{'name' :'test','x':'12345','y':'12345678'}' – chakri

+0

请不要重新发明stdlib。 'urlparse'模块还包含用于解析查询字符串并返回字典的'parse_qs'方法。您的词典理解将简化为'query_param_dict = parse_qs(parse.query)'。 – PaulMcG