我现在也有类似的情况。我正在尝试下载图像。我在 JSON 文件中从服务器检索 URL。一些图像包含非 ASCII 字符。这会引发错误:
for image in product["images"]:
filename = os.path.basename(image)
filepath = product_path + "/" + filename
urllib.request.urlretrieve(image, filepath) # error!
UnicodeEncodeError: 'ascii' 编解码器无法在位置编码字符 '\xc7' ...
我尝试过使用.encode("UTF-8"),但不能说它有帮助:
# coding=UTF-8
import urllib
url = u"http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = url.encode("UTF-8")
urllib.request.urlretrieve(url, "D:\image-1.jpg")
这只会引发另一个错误:
TypeError: 不能在类似字节的对象上使用字符串模式
然后我给了urllib.parse.quote(url)一个机会:
import urllib
url = "http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = urllib.parse.quote(url)
urllib.request.urlretrieve(url, "D:\image-1.jpg")
这又引发了另一个错误:
ValueError:未知 url 类型:'http%3A//example.com/wp-content/uploads/2018/09/%C4%B0MAGE-1.png'
"http://..." 中的: 也被转义了,我认为这就是问题的原因。
所以,我想出了一个解决方法。我只是引用/转义路径,而不是整个 URL。
import urllib.request
import urllib.parse
url = "http://example.com/wp-content/uploads/2018/09/İMAGE-1.png"
url = urllib.parse.urlparse(url)
url = url.scheme + "://" + url.netloc + urllib.parse.quote(url.path)
urllib.request.urlretrieve(url, "D:\image-1.jpg")
这就是 URL 的样子:"http://example.com/wp-content/uploads/2018/09/%C4%B0MAGE-1.png",现在我可以下载图片了。