如何在Python中编码URL

1 投票
2 回答
802 浏览
提问于 2025-04-16 20:34

我写了一个用来解码网址的函数。

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包会处理好这个问题。

撰写回答