1

我有个问题。我正在尝试在 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)。请告诉我

谢谢。

4

2 回答 2

2

我认为您正在将多个问题复杂化为 1。

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

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

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

最后,你不明白 quote 和 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() 一次以获取正常的 URL。
  3. 当您获得未引用的 URL 时,首先将其传递给 urlparse.urlparse() 以将组件分解为相应的部分。
  4. urllib.unquote() 文件名部分。
  5. 现在您可以检索原始文件名,您可以继续做任何您需要做的事情。

参考:

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

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

于 2012-04-09T09:40:29.853 回答
0

答案在有关引用方法的文档中

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

a并且a1有所不同,因为a可能没有使用引用quote(),因此引用的字符比需要的要多。仍然是有效的a1带引号的字符串,但有些字符没有被引用,因为它们不必这样做。

于 2012-04-09T09:23:06.870 回答