2012-04-09 71 views
1

我有个问题。 我想在python中使用urllib库。 但我不明白这一点。python:关于url编码和解码

a = 'http%3A%2F%2Ffile%2Efir%2Enet%2F40d55cecf9a3a47851b1d0ebda3e423993c837d3ca%2F20110909%5F52%5Fblogfile%2Folsscj25%5F1315512137967%5F5tAuGI%5Fzip%2F%255B%25C0%25A9%25B5%25B5%25BF%25ECxp%255D%2B%25C0%25A9%25B5%25B5%25BF%25ECxp%2B%25BD%25C3%25B8%25AE%25BE%25F3%25B3%25D1%25B9%25F6%5F%2Ezip' 

aa = unquote(unquote(a)) 
'http://file.fir.net/40d55cecf9a3a47851b1d0ebda3e423993c837d3ca/20110909_52_blogfile/olsscj25_1315512137967_5tAuGI_zip/[\xc0\xa9\xb5\xb5\xbf\xecxp]+\xc0\xa9\xb5\xb5\xbf\xecxp+\xbd\xc3\xb8\xae\xbe\xf3\xb3\xd1\xb9\xf6_.zip' 

a1 = quote(quote(aa)) 
'http%253A//file.fir.net/40d55cecf9a3a47851b1d0ebda3e423993c837d3ca/20110909_52_blogfile/olsscj25_1315512137967_5tAuGI_zip/%255B%25C0%25A9%25B5%25B5%25BF%25ECxp%255D%252B%25C0%25A9%25B5%25B5%25BF%25ECxp%252B%25BD%25C3%25B8%25AE%25BE%25F3%25B3%25D1%25B9%25F6_.zip' 

为什么不等于两个值(a和a1)。 请让我知道

谢谢。

回答

2

我认为你的卷积多个问题到1

首先,你问这个问题的唯一原因是因为你想解除引用的文件名,这似乎被引用两次的尾部。

其次,即使双引号,文件名也会导致非utf-8编码数据,并且它不可打印。

第三,你似乎不了解URL格式。

最后,你不明白引用和取消引用实际上在做什么。

urllib.quote()和urllib.unquote()仅用于URL的path_info部分,这是http://file.fir.net/后的所有内容。

urllib.quote()替换字符串参数中的所有内容,这些字符串在编码百分比的URL中不是“安全的”,意思是每个会导致问题的字符(例如:〜[SPACE]等)以%BYTES_IN_HEX格式。

由于[:]是不是在URL的路径部分安全,报价()将与它的百分号编码器编码

所有的这些方法,你应该对整个URL不能通过直入引号(。 ),除非你碰巧想将一个URL实际编码到一个URL的path_info部分

解决你的问题的步骤我这是这样的:

  1. 修复文件名编码使用可打印的东西来帮助您调试。
  2. urllib.unquote()一次取回正常的URL。
  3. 当您获取未加引号的URL时,首先将它传递给urlparse.urlparse()以将组件拆分为适当的部分。
  4. urllib.unquote()文件名部分。
  5. 现在您可以检索原始文件名,您可以继续进行任何您需要的操作。

参考文献:

http://docs.python.org/library/urlparse.html

http://docs.python.org/library/urllib.html

+0

谢谢你的建议。我发现该怎么做。 – user1161599 2012-04-09 17:04:02

0

答案是在documentation on quote method

...字母,数字和字符 '_.-' 从不引用。 ...

aa1不同,因为a可能没有使用quote(),因此更多的字符地方比它需要引用引用。 a1仍然是有效的带引号的字符串,但有些字符因没有必要引用而没有引用。

+0

感谢您的回答。我怎样才能做出同等的价值。我的用户希望搜索网址的值为aa。所以我必须将aa编码为a。云你帮忙吗? – user1161599 2012-04-09 09:27:02

+0

首先请编辑你的帖子,告诉我们你是如何获得'a'的,即它是如何被引用的? – kgr 2012-04-09 09:29:33