我正在创建一个程序,将下载一个。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存储在字符串类型?


当前回答

是的,当然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)

其他回答

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

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

是的,当然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)

我希望我正确理解了这个问题,即:当URL存储为字符串类型时,如何从服务器下载文件?

我下载文件并保存在本地使用下面的代码:

import requests

url = 'https://www.python.org/static/img/python-logo.png'
fileName = 'D:\Python\dwnldPythonLogo.png'
req = requests.get(url)
file = open(fileName, 'wb')
for chunk in req.iter_content(100000):
    file.write(chunk)
file.close()

这里我们可以在Python3中使用urllib的Legacy接口:

下面的函数和类是从Python 2模块urllib(而不是urllib2)移植过来的。它们在将来的某个时候可能会被弃用。

示例(2行代码):

import urllib.request

url = 'https://www.python.org/static/img/python-logo.png'
urllib.request.urlretrieve(url, "logo.png")
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))