现在我在维基百科上工作。在很多文章中,我注意到一些 URL,例如 https://www.google.com/search?q=%26%E0%B8%89%E0%B8%B1%E0%B8%99 , 很长。示例 URL 可以替换为“https://www.google.com/search?q=%26ฉัน”(ฉัน 是泰语单词),这样更短更简洁。但是,当我使用 urllib.unquote 函数解码 URL 时,它甚至解码 %26 并得到“https://www.google.com/search?q=&ฉัน”作为结果。您可能已经注意到,这个 URL 是无用的;它没有建立有效链接。
因此,我想知道如何在有效的情况下获取解码链接。我认为只解码非 ascii 字符将获得有效的 URL。这是对的吗?以及如何做到这一点?
谢谢:)
最佳答案
最简单的方法,您可以将所有低于 %80 (%00-%7F) 的 URL 编码序列替换为一些占位符,进行 URL 解码,并将原始 URL 编码序列替换回占位符。
另一种方法是查找 UTF-8 序列。您的 URL 似乎以 UTF-8 编码,而维基百科使用 UTF-8。你可以看到 Wikipedia entry for UTF-8了解 UTF-8 字符的编码方式。
因此,当在 URL 中编码时,每个有效的非 ascii UTF-8 字符都将遵循以下模式之一:
- (%C0-%DF)(%80-%BF)
- (%E0-%EF)(%80-%BF)(%80-%BF)
- (%F0-%F7)(%80-%BF)(%80-%BF)(%80-%BF)
- (%F8-%FB)(%80-%BF)(%80-%BF)(%80-%BF)(%80-%BF)
- (%FC-%FD)(%80-%BF)(%80-%BF)(%80-%BF)(%80-%BF)(%80-%BF)
因此您可以在 URL 中匹配这些模式并分别取消引用每个字符。
但是,请记住并非所有 URL 都以 UTF-8 编码。
在一些旧网站中,他们仍然使用其他字符集,例如泰语的 Windows-874。
在这种情况下,该特定网站的“ฉัน”编码为“%A9%D1%B9”而不是“%E0%B8%89%E0%B8%B1%E0%B8%99”。如果您使用 urllib.unquote
解码它,您将得到一些乱码文本,例如“?ѹ”而不是“ฉัน”,这可能会破坏链接。
因此您必须小心并检查 URL 解码是否破坏了链接。确保您正在解码的 URL 是 UTF-8。
关于python - 仅解码 URL 非 ascii 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857253/