如何在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 个回答
1
还有一点需要补充的是,在使用urllib.unquote(url)获取到没有引号的链接后,你可能需要用decode('utf8')把这个原始字符串转换成Unicode字符串。
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编码的;如果你需要Unicode字符串,可以用str.decode('utf8')来转换。
正如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包会处理好这个问题。