如何在python中编码url

时间:2011-06-30 05:37:13

标签: python url

我创建了一个解码网址的函数。

from urllib import unquote

def unquote_u(source):
  result = source
  if '%u' in result:
    result = result.replace('%u','\\u').decode('unicode_escape')
  result = unquote(result)
  print result
  return result

if __name__=='__main__':
    unquote_u('{%22%22%3A%22test_%E5%93%A6%E4%BA%88%E4%BB%A5%E8%85%BF%E5%93%A6.doc.txt%22%2C%22mimeType%22%3A%22text%2Fplain%22%2C%22compressed%22%3Afalse%7D')

但是,我不能得到正确的文件名。 正确的文件名是:test_哦予以腿哦.doc

谁能告诉我怎么做?

2 个答案:

答案 0 :(得分:5)

urllib.unquote可以做到:

>>> urllib.unquote('{%22%22%3A%22test_%E5%93%A6%E4%BA%88%E4%BB%A5%E8%85%BF%E5%93%A6.doc.txt%22%2C%22mimeType%22%3A%22text%2Fplain%22%2C%22compressed%22%3AFalse%7D')
'{"":"test_\xe5\x93\xa6\xe4\xba\x88\xe4\xbb\xa5\xe8\x85\xbf\xe5\x93\xa6.doc.txt","mimeType":"text/plain","compressed":False}'
>>> eval(_)
{'': 'test_\xe5\x93\xa6\xe4\xba\x88\xe4\xbb\xa5\xe8\x85\xbf\xe5\x93\xa6.doc.txt', 'mimeType': 'text/plain', 'compressed': False}
>>> _['']
'test_\xe5\x93\xa6\xe4\xba\x88\xe4\xbb\xa5\xe8\x85\xbf\xe5\x93\xa6.doc.txt'
>>> print _
test_哦予以腿哦.doc.txt

请注意,我必须在引用的字符串中将“false”更改为“False”。另外,unquote之后的字符串仍然是UTF-8编码的;你可以使用str.decode('utf8')来获取你需要的Unicode字符串。

<小时/> 正如JBernardo所提到的,不安全数据的eval()是一个非常糟糕的主意。任何知道甚至怀疑服务器端脚本是eval()表单数据的人都可以轻松地使用可能危及服务器的命令来制作POST。更好的是:

>>> import json, urllib
>>> json.loads(urllib.unquote('{%22%22%3A%22test_%E5%93%A6%E4%BA%88%E4%BB%A5%E8%85%BF%E5%93%A6.doc.txt%22%2C%22mimeType%22%3A%22text%2Fplain%22%2C%22compressed%22%3Afalse%7D'))['']
u'test_\u54e6\u4e88\u4ee5\u817f\u54e6.doc.txt'
>>> print _
test_哦予以腿哦.doc.txt

另请注意,此后续方法不需要将false更改为False;事实上,如果我这样做,它就不起作用。 json包解决了这个问题。

答案 1 :(得分:1)

要添加一件事,在从urllib.unquote(url)获取不带引号的url后,您可能需要使用decode('utf8')将原始字符串转换为unicode字符串。