在Python中将UTF-8地址发送给urlretrieve

2 投票
1 回答
1966 浏览
提问于 2025-04-28 13:25

我在浏览器中尝试访问一个文件,文件名里有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发送到服务器请求时,它会以同样的方式进行编码。

撰写回答