Как просил @albert, я отправляю решение, которое я нашел. Используя метод «quote» «urllib», вы можете кодировать латинские символы и символы как «», «(» и все другие специальные символы. Поскольку «цитата» будет конвертировать «http:» в «http% 3A», которая не нужна Необходимо было разделить URL-адрес и только преобразовать желаемую часть. Еще одна вещь, которую вы должны рассмотреть, - это если URL-адреса уже частично или полностью закодированы, в этом случае URL-адрес может содержать некоторые кодированные символы utf8, которые будут содержать «%», , цитата будет продолжаться «%» как специальный символ и Виль преобразовать его в «% 25», который будет беспорядок URL, к, не возвращающей беспорядке
Пример случая:
If the url is url = "http://something/cóntaining space song name.mp3"
Если URL уже частично закодирован (например, «» будет «% 20»), затем курсор нт URL может выглядеть следующим образом
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"
в результате беспорядок!
С учетом сказанного; мы не можем разделить URL-адрес на «http:» и остальную часть, а затем применить «цитату» ко второй части URL-адреса.
Итак, решение; Кодировать эти специальные символы один за другим; замените каждый латинский или специальный символ на его utf-код. Затем возникает вопрос «Как?»
Больно попробовать, если каждый URL-адрес содержит символ списка из этих символов (другое дело, если URL-адрес юникода, вы не можете использовать url.find ("-")). Затем сюда приходит трюки ! Проблема - это решение!
Поиск латинских и специальных символов! как их найти?! С ИСКЛЮЧЕНИЕМ !
Если URL (содержащий недопустимые символы) имеет типа «Юникод» преобразующий их в строку вызывает исключение
Если адрес (содержащий недопустимые символы) имеет тип «ул» их преобразования в юникод возбудит исключение
Мы находим разыскиваемых символы за исключением ;-)
Затем разделить URL на позиции этого символа, процитировать charcters и в конце восстановления URL.
Для моего случая, URL'ы, являются юникода:
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-адрес содержит несколько «плохих» персонажей, приведенный выше код будет рассматривать первый в каждом URL, так ли выполнить его рекурсивным способом или запустить его несколько раз, пока вы не получите выход. Желаю этого.
Generic пример, когда URL имеет тип «ул»:
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
Я желаю решения полезно для тех, кто встретит.
Я пробовал открыть https://something.s3.amazonaws.com/music/something/this%c3%b3.mp3 в firefox и преобразовал его в https://something.s3.amazonaws.com/music/. что-то/this.m.mp3, а затем отобразили страницу AccessDenied в XML. Исходя из этого, похоже, что замена латинских специальных символов на utf8-коды не решает проблему. –
@TrisNefzger да браузер заменить его правильно, но с soundmanager (под firefox) он не воспроизводится. Я нашел решение с urllib.quote, если вы хотите, я могу поделиться им. Спасибо :-) –
Рад, что вы нашли решение. Из того, что вы написали, предположите, что это url = urllib.quote (url). На Python 2, который привел к «https% 3A // something.s3.amazonaws.com/music/something/this% C3% B3.mp3, но для Python3 нет urllib.quote(), однако urllib.request.quote (url) дает тот же результат. Пожалуйста, поделитесь своим решением в ответе за всех. Благодарю. –