python:关于url编码和解码

时间:2012-04-09 09:11:13

标签: python urlencode urldecode

我有问题。 我正在尝试在python中使用urllib库。 但是,我不明白。

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 个答案:

答案 0 :(得分:2)

我认为你将多个问题卷入1。

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

其次,文件名,即使是双重不加引号,也会产生非utf-8编码数据,并且不可打印。

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

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

urllib.quote()和urllib.unquote()仅适用于URL的path_info部分,即http://file.fir.net/之后的所有部分。

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

由于[:]在URL的路径部分中不安全,因此quote()将使用它的百分比编码对其进行编码。

所有这些意味着你不应该将整个URL直接传递给quote(),除非你碰巧想要将URL实际编码到URL的path_info部分。

解决问题的步骤如下:

  1. 修复文件名编码以使用可打印的内容来帮助您进行调试。
  2. urllib.unquote()一次返回普通网址。
  3. 当您获得不带引号的URL时,首先将其传递给urlparse.urlparse()以将组件分解为适当的部分。
  4. urllib.unquote()文件名部分。
  5. 现在您可以检索原始文件名,您可以继续做任何您需要做的事情。
  6. 参考文献:

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

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

答案 1 :(得分:0)

答案在documentation on quote method

  

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

aa1之间存在差异,因为a可能未使用quote()引用,因此引用的字符多于其所需的字符数。 a1仍然是有效的引用字符串,但有些字符没有引用,因为它们没有引用。