当前位置: 首页 > 知识库问答 >
问题:

如何将word文档从URL下载到python中指定目录下的文件夹中?[副本]

龙浩博
2023-03-14

我正试图从一个网站下载多个word文档到一个我可以反复浏览的文件夹中。它们托管在sharepoint列表中,我已经能够解析HTML代码来编译这些word文档的所有链接列表。这些链接(单击时)会提示您打开或保存word文档。在这些链接的末尾,还有doc这个词的标题。我已经能够拆分URL字符串,以获得与我的URL列表对齐的word文档的名称列表。我的目标是编写一个循环,遍历所有URL并将所有word文档下载到一个文件夹中。编辑-考虑@DeepSpace和@aneroid的建议(并尽我最大努力实现它们)。。。我的代码-

 import requests
 from requests_ntlm import HttpNtlmAuth
 import shutil

 def download_word_docs(doc_url, doc_name):
    r = requests.get(doc_url, auth=HttpNtlmAuth(domain\\user, pass), stream=True)
    with open(doc_name, 'wb') as f:                                                                                                                                                
       shutil.copyfileobj(r.raw, f) #where's it copying the fileobj to?

我认为这与图像不同,因为我的请求是下载链接,而不是物理jpeg图像。。。我可能错了,但这是一个棘手的情况。

我仍在尝试让我的程序下载(或创建一个副本)。以指定路径(我可以设置)将docx文件放入文件夹中。目前它在管理命令提示符下运行(我在Windows上),没有错误,但我不知道它将文件复制到哪里。我的希望是,如果我能找到一个工作,我可以想出如何循环它在我的URL列表。感谢各位(@DeepSpace和@aneroid)迄今为止的帮助。

共有2个答案

澹台成龙
2023-03-14

请尝试此代码,看看它是否适合您:

from urllib.request import Request, urlopen

def get_html(url, timeout = 15):
    ''' function returns html of url
    usually html = urlopen(url) is enough but sometimes it doesn't work
    also instead urllib.request you can use any other method to get html
    code of url like urllib or urllib2 (just search it online), but I
    think urllib.request comes with python installation'''

    html = ''
    try:
        html = urlopen(url, None, timeout)
    except:
        url = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
        try:
            html = urlopen(url, None, timeout)
        except:
            pass
    return html

def get_current_path():
    ''' function returns path of folder in which python program is saved'''

    try:
        path = __file__
    except:
        try:
            import sys
            path = sys.argv[0]
        except:
            path = ''
    if path:
        if '\\' in path:
            path = path.replace('\\', '/')
        end = len(path) - path[::-1].find('/')
        path = path[:end]
    return path

def check_if_name_already_exists(name, path, extension):
    ''' function checks if there is already existing file
    with same name in folder given by path.'''

    try:
        file = open(path + name + extension, 'r')
        file.close()
        return True
    except:
        return False

def get_new_name(old_name, path, extension):
    ''' functions ask user to enter new name for file and returns inputted name.'''

    print('File with name "{}" already exist.'.format(old_name))
    answer = input('Would you like to replace it (answer with "r")\nor create new one (answer with "n") ? ')
    while answer not in 'rRnN':
        print('Your answer is inconclusive')
        print('Please answer again:')
        print('if you would like to replece the existing file answer with "r"')
        print('if you would like to create new one answer with "n"')
        answer = input('Would you like to replace it (answer with "r")\n or create new one (answer with "n") ? ')
    if answer in 'nN':
        new_name = input('Enter new name for file: ')
        if check_if_name_already_exists(new_name, path, extension):
            return get_new_name(new_name, path)
        else:
            return new_name
    if answer in 'rR':
        return old_name

def get_url_extension(url):
    if url[::-1].find('cod.') == 0:
        return '.doc'
    if url[::-1].find('xcod.') == 0:
        return '.docx'

def download_word(url, name = 'document', path = None):
    '''function downloads word file from its url
    required argument is url of pdf file and
    optional argument is name for saved pdf file and
    optional argument path if you want to choose where is your file saved
    variable path must look like:
        'C:\\Users\\Computer name\\Desktop' or
        'C:/Users/Computer name/Desktop' '''
    # and not like
    #   'C:\Users\Computer name\Desktop'

    word = get_html(url)
    extension = get_url_extension(url)

    name = name.replace(extension, '')
    if path == None:
        path = get_current_path()
    if '\\' in path:
        path = path.replace('\\', '/')
    if path[-1] != '/':
        path += '/'
    if path:
        check = check_if_name_already_exists(name, path, extension)
        if check:
            if name == 'document':
                i = 1
                name = 'document(' + str(i) + ')'
                while check_if_name_already_exists(name, path, extension):
                    i += 1
                    name = 'document(' + str(i) + ')'
            else:
                name = get_new_name(name, path, extension)
        file = open(path+name + extension, 'wb')
    else:
        file = open(name + extension, 'wb')

    file.write(word.read())
    file.close()
    if path:
        print(name + extension + ' file downloaded in folder "{}".'.format(path))
    else:
        print(name + extension + ' file downloaded.')
    return


download_url = 'http://www.scripps.edu/library/open/instruction/googletips.doc'
download_url = 'http://regionblekinge.se/a/uploads/dokument/demo.docx'
download_word(download_url)
邵绪
2023-03-14

在代码中,您提到

“有没有办法避免打开/写入新文件并直接下载?”

没有直接下载。这就是浏览器通过类似于您试图编写的代码所做的。他们正在使用服务器或URL指定的名称“创建新文件”。

几天前我写这篇文章是为了其他目的,与@DeepSpace链接的答案类似:

def save_link(book_link, book_name):
    the_book = requests.get(book_link, stream=True)
    with open(book_name, 'wb') as f:
        for chunk in the_book.iter_content(1024 * 1024 * 2):  # 2 MB chunks
            f.write(chunk)

book\u name是在另一个函数中从book\u链接的文本中检索的,但您也可以这样做:

>

  • 检查响应标题是否包含文件名。

    如果没有,请使用URL的结尾作为文件名,如果可能的话:

    >>> the_link = 'http://example.com/some_path/Special%20document.doc'
    >>> filename = urllib.unquote_plus(the_link.split('/')[-1])
    >>> print filename
    Special document.doc
    >>> # then do
    ... with open(filename, 'wb') as f:
    ....    # etc.
    

  •  类似资料:
    • 我将一个bucket名称存储为string 我想从这个s3桶下载文件,并作为附件结束一封电子邮件。这个文件夹中只有一个文件,但要得到这个文件,我们需要在文件夹上迭代,因为我不知道文件的名称。 这是我正在做的,但这个代码给我错误。 str对象没有属性 这是我的python代码 我是python新手

    • 问题内容: 我正在尝试使用HttpClient下载PDF文件。我可以获取文件,但是我不确定如何将字节转换为PDF并将其存储在系统中的某个位置 我有以下代码,如何将其存储为PDF? 问题答案: 编辑: 您还可以使用BufferedOutputStream和BufferedInputStream来加快下载速度:

    • 本文向大家介绍vbs 复制指定文件到指定目录下,包括了vbs 复制指定文件到指定目录下的使用技巧和注意事项,需要的朋友参考一下 复制指定文件到指定目录下 核心代码 代码二 其实原理都是一样的。

    • 问题内容: 好吧,这看起来很简单,确实如此。将文件下载到服务器所需要做的就是: 只有一个问题。如果文件很大,例如100mb,该怎么办?然后,您将耗尽内存,并且无法下载文件。 我想要的是一种在下载文件时将文件写入磁盘的方法。这样,我可以下载更大的文件,而不会遇到内存问题。 问题答案: 从PHP 5.1.0开始,支持通过传递流句柄作为参数来逐段编写: 从手册中: 如果 数据 [是第二个参数]是流资源,

    • 文件名的开始是相同的,但结束是动态的,每次我点击下载时都会改变 我所做的: 你能帮忙吗