我正在创建一个程序,将下载一个。jar (java)文件从一个web服务器,通过读取URL指定在同一游戏/应用程序的。jad文件。我使用的是Python 3.2.1

我已经设法从JAD文件中提取JAR文件的URL(每个JAD文件都包含到JAR文件的URL),但是正如您想象的那样,提取的值是type()字符串。

这是相关的函数:

def downloadFile(URL=None):
    import httplib2
    h = httplib2.Http(".cache")
    resp, content = h.request(URL, "GET")
    return content

downloadFile(URL_from_file)

然而,我总是得到一个错误,说在上面的函数的类型必须是字节,而不是字符串。我尝试使用URL.encode('utf-8'),也字节(URL,encoding='utf-8'),但我总是得到相同或类似的错误。

所以基本上我的问题是如何从服务器下载文件时,URL存储在字符串类型?


当前回答

当我想要与HTTP请求相关的东西时,我使用请求包,因为它的API非常容易开始:

首先,安装请求

$ pip install requests

然后代码:

from requests import get  # to make GET request


def download(url, file_name):
    # open in binary mode
    with open(file_name, "wb") as file:
        # get request
        response = get(url)
        # write to file
        file.write(response.content)

其他回答

当我想要与HTTP请求相关的东西时,我使用请求包,因为它的API非常容易开始:

首先,安装请求

$ pip install requests

然后代码:

from requests import get  # to make GET request


def download(url, file_name):
    # open in binary mode
    with open(file_name, "wb") as file:
        # get request
        response = get(url)
        # write to file
        file.write(response.content)

是的,当然requests是一个很好的包,用于与HTTP请求相关的东西。但是我们需要注意输入数据的编码类型,下面是一个解释差异的示例


from requests import get

# case when the response is byte array
url = 'some_image_url'

response = get(url)
with open('output', 'wb') as file:
    file.write(response.content)


# case when the response is text
# Here unlikely if the reponse content is of type **iso-8859-1** we will have to override the response encoding
url = 'some_page_url'

response = get(url)
# override encoding by real educated guess as provided by chardet
r.encoding = r.apparent_encoding

with open('output', 'w', encoding='utf-8') as file:
    file.write(response.content)

你可以使用wget,一个流行的shell下载工具。https://pypi.python.org/pypi/wget 这将是最简单的方法,因为它不需要打开目标文件。这里有一个例子。

import wget
url = 'https://i1.wp.com/python3.codes/wp-content/uploads/2015/06/Python3-powered.png?fit=650%2C350'  
wget.download(url, '/Users/scott/Downloads/cat4.jpg') 
from urllib import request

def get(url):
    with request.urlopen(url) as r:
        return r.read()


def download(url, file=None):
    if not file:
        file = url.split('/')[-1]
    with open(file, 'wb') as f:
        f.write(get(url))

如果你正在使用Linux,你可以通过python shell使用Linux的wget模块。下面是一个示例代码片段

import os
url = 'http://www.example.com/foo.zip'
os.system('wget %s'%url)