【问题标题】:Download a file (Python 3.4.1 Win8) with no direct link to filename下载没有直接链接到文件名的文件(Python 3.4.1 Win8)
【发布时间】:2014-08-21 15:27:08
【问题描述】:

我编写了以下简单代码(借助 stackoverflow,谢谢!)从 url 链接下载文件:

import requests
url = "http://www.url.com/file.pdf"
response = requests.get(url)
output = open('file.pdf', 'wb')
output.write(response.content)

只要我在 url 中有一个文件名,代码就可以正常工作。但是,有些链接会直接打开带有不包含文件名的 url 的 pdf。请求有办法处理吗?

一些附加信息:有问题的 url 包含字符串“.cfm?”我发现这是指冷融合标记语言。我希望这将有助于有人为我找到解决方案。

【问题讨论】:

    标签: python download


    【解决方案1】:

    当浏览器收到带有文件的响应时,它会查找文件名作为 URL 的一部分,但如果有带有文件名参数的 Content-Disposition header(最初是 MIME 标头,但也用于 HTTP)那么文件名就是取自那个。

    requests 不给你任何具体的帮助;而是自己做:

    import cgi
    from urllib.parse import urlsplit
    
    def filename_from_response(response):
        cdisp = response.headers.get('content-disposition')
        if cdisp:
            _, params = cgi.parse_header(cdisp)
            if 'filename' in params:
                return filename
        last_part = urlsplit(response.url).path.rpartition('/')[-1]
        return last_part
    

    【讨论】:

    • 我使用 resp.headers 来获取头部信息。它返回 {'Content-Type': 'text/html; charset=UTF-8', 'Date': 'Thu, 2014 年 8 月 21 日 15:12:02 GMT', 'Transfer-Encoding': 'chunked', 'X-Powered-By': 'ASP.NET', '服务器':'Microsoft-IIS/7.5'}。这应该是 Content-Disposition 标头所在的位置吗?
    • @cptwinky:Content-Disposition 是可选的标头。无论如何,你得到的是 HTML,而不是 PDF,显然这不应该被视为可下载的文件。
    • 我尝试访问的文件是免费且开放的。在浏览器中单击下载链接时,会在浏览器窗口中出现一个 pdf 并且可以下载。我在上面发布的响应标头来自pdf打开时存在的url的复制和粘贴
    • @cptwinky:但这不是 PDF 响应。也许 HTML 会加载 JavaScript,然后再加载 PDF?
    • 我不知道。我想这是我的问题。看来如果我可以手动下载文件,我应该可以用 python 来完成
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2017-08-26
    • 2023-03-15
    • 2012-10-05
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多