在Python中将UTF-8地址发送给urlretrieve
我在浏览器中尝试访问一个文件,文件名里有utf-8字符,但出现了错误。
The requested URL /images/0/04/×¤×ª×¨×•× ×•×ª_תרגילי×_על_משטחי×_דיפ'_2014.pdf was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.`
为了能访问这些文件,我写了下面这个Python脚本:
# encoding: utf8
__author__ = 'Danis'
__date__ = '20/10/14'
import urllib
curr_link = u'http://math-wiki.com/images/0/04/2014_\'דיפ_משטחים_על_פתרונות.nn uft8pdf'
urllib.urlretrieve(link, 'home/danisf/targil4.pdf')
但是当我运行这个代码时,出现了错误:URLError:<curr_link在这里出现> 包含非ASCII字符
我该怎么修改代码才能让它正常工作呢?(顺便说一下,我没有权限访问服务器或者网站管理员)也许浏览器出错并不是因为文件名的编码问题?
1 个回答
3
你不能直接把Unicode格式的URL放进urllib
的函数里;URL必须是有效的字节串。你需要先把它编码成UTF-8格式,然后再进行URL编码。
import urllib
import urlparse
curr_link = u'http://math-wiki.com/images/0/04/2014_\'דיפ_משטחים_על_פתרונות.nn uft8pdf'
parsed_link = urlparse.urlsplit(curr_link.encode('utf8'))
parsed_link = parsed_link._replace(path=urllib.quote(parsed_link.path))
encoded_link = parsed_link.geturl()
urllib.urlretrieve(encoded_link, 'home/danisf/targil4.pdf')
不过,你在问题中提供的具体URL会产生404错误,也就是找不到页面。
示例:
>>> import urllib
>>> import urlparse
>>> curr_link = u'http://math-wiki.com/images/0/04/2014_\'דיפ_משטחים_על_פתרונות.nn uft8pdf'
>>> parsed_link = urlparse.urlsplit(curr_link.encode('utf8'))
>>> parsed_link = parsed_link._replace(path=urllib.quote(parsed_link.path))
>>> print parsed_link.geturl()
http://math-wiki.com/images/0/04/2014_%27%D7%93%D7%99%D7%A4_%D7%9E%D7%A9%D7%98%D7%97%D7%99%D7%9D_%D7%A2%D7%9C_%D7%A4%D7%AA%D7%A8%D7%95%D7%A0%D7%95%D7%AA.nn%20uft8pdf
你的浏览器通常会把这种UTF-8格式的字节解码,显示成可读的URL,但在把这个URL发送到服务器请求时,它会以同样的方式进行编码。