2014-10-20 23 views
0

urlretrieve試圖訪問其名稱包含UTF-8字符從瀏覽器中我得到的錯誤發送UTF-8 ADRESS在Python

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 appears here> contains non-ASCII characters

我怎樣才能修復代碼,讓他工作? (順便說一下,我無法訪問服務器或網站管理員)也許瀏覽器失敗不是因爲文件名稱的錯誤編碼?

+0

那麼,404是你的預期結果? – falsetru 2014-10-20 13:10:11

+0

不,我想獲取文件。接收名爲「ex20-2014.pdf」的文件可以在瀏覽器中正常工作。我想得到這個文件,因爲我認爲這個html頁面中的某些東西被GET損壞了。 – 2014-10-20 13:13:29

+0

您可以下載哪些原始網址? – falsetru 2014-10-20 13:15:43

回答

1

你不能傳遞Unicode URL轉換成urllib功能;網址必須是有效的字節串。你需要編碼成UTF-8,那麼URL報價你的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時到服務器以檢索,它的確切被編碼同樣的方式。

+0

文件將被保存在哪裏? – 2014-10-20 13:25:53

+0

如果url重定向到404,則表示該文件不存在? – 2014-10-20 13:28:04

+0

@DanisFischer:這意味着該文件不存在。這是從哪個頁面鏈接而來的? – 2014-10-20 13:30:01