Python:URL编码带有拉丁字符的网址

时间:2015-09-03 16:10:38

标签: python url utf-8 urllib2 latin

我在数据库中有许多具有“url”属性的实体,这么多记录中的url属性是硬编码的,即包含拉丁字符,这在Firefox中不起作用(网址用于存储在s3中的歌曲文件和我用soundmanager2播放它们。

示例:

url with latin character "ó": https://something.s3.amazonaws.com/music/something/thisó.mp3

如果我用其utf8代码“%c3%b3”替换“ó”,那么https://something.s3.amazonaws.com/music/something/this%c3%b3.mp3可以正常工作

我想用基于this chart

的网址编码utf8代码替换所有拉丁语和特殊字符

1 个答案:

答案 0 :(得分:1)

正如@albert所说,我发布了我找到的解决方案。使用“urllib”的“引用”方法,你可以编码拉丁语和字符,如“”,“”和所有其他特殊字符。由于“引用”将“http:”转换为“http%3A”,这是不希望的,必须拆分网址,只转换想要的部分。另外你应该考虑的是,如果网址已经部分或完全编码,在这种情况下,网址可能包含一些utf8编码字符,其中包含“%” ,引用将作为一个特殊字符继续“%”,并将它转换为“%25”,这将把网址弄得乱七八糟!

案例:

If the url is url = "http://something/cóntaining space song name.mp3"

如果网址已经部分编码(例如“”将为“%20”),则当前网址可能如下所示

url =“http://something/cóntaining%20space%20song%20name.mp3

urllib.quote(url)将给出(让我们假设“http:”未转换为“http:%3A”)urllib.quote将给出:

http://something/c%C3%B3ntaining%2520space%2520song%2520name.mp3

结果很糟糕!

有了这样说;我们不能将网址分成“http:”和其余部分,然后将“引用”应用到网址的第二部分。

所以解决方案;逐个编码这些特殊字符;用utf代码替换每个拉丁语或特殊字符。然后出现了问题“如何?”

尝试每个url包含由这些字符组成的列表的字符是很痛苦的(另一件事,如果url是unicode你不能使用url.find(“ó”)),那么这里有一些技巧!问题是解决方案!

找到拉丁语和特殊字符!怎么找到他们?!除外!

如果url(包含坏字符)的类型为“unicode”,则将它们转换为字符串会引发异常

如果url(包含坏字符)的类型为“str”,则将它们转换为unicode会引发异常

我们找到了有例外的有用字符; - )

然后将网址拆分到该字符的位置,引用字符,最后重建网址。

对于我的情况,网址是unicode:

import sys
import urllib

from core.models import Song


songs = Song.objects.all()

for song in songs:
    try:
        x = str(song.song_url) #will cause exception with urls containing bad characters
    except(UnicodeEncodeError):
        k = sys.exc_info()
        pos = k[1][2] #getting the position of the bad character
        c = song.song_url[pos].encode("utf8")
        q =  urllib.quote(c)
        p1 = song.song_url[:pos] #splitted part one
        p2 = song.song_url[pos+1:] #splitted part two
        res = p1 + q + p2 #rebuit url
        song.song_url = res
        song.save()
        print res

注意,如果url包含多个“bad”字符,则上面的代码将处理每个url中的第一个,因此无论是以递归方式执行它还是多次运行它直到您没有输出。 我希望这会有所帮助。

url的类型为“str”的通用示例:

import sys
import urllib

url = "https://something.s3.amazonaws.com/music/something/thisó.mp3"

try:
    x = unicode(url)
except(UnicodeDecodeError):
    k = sys.exc_info()
    pos = k[1][2]
    url2 = url.decode('utf8')
    c = url2[pos].encode("utf8")
    q =  urllib.quote(c)
    p1 = url2[:pos]
    p2 = url2[pos+1:]
    res = p1 + q + p2
    print res

我希望这个解决方案对任何来到这里的人都有帮助。