2015-09-03 3 views
1

У меня есть много объектов в базе данных с атрибутом «url», атрибут url во множестве записей жестко закодирован, то есть содержит латинские символы, которые не работают в Firefox (URL-адреса для файлов песен, хранящихся в s3, и я воспроизвожу их с помощью soundmanager2).Python: URL кодирует URL-адреса с латинскими символами

Пример:

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 работает

Я хотел бы заменить все латинские и специальные символы с их URL-адрес кодирования utf8 коды на основе this chart

+0

Я пробовал открыть https://something.s3.amazonaws.com/music/something/this%c3%b3.mp3 в firefox и преобразовал его в https://something.s3.amazonaws.com/music/. что-то/this.m.mp3, а затем отобразили страницу AccessDenied в XML. Исходя из этого, похоже, что замена латинских специальных символов на utf8-коды не решает проблему. –

+0

@TrisNefzger да браузер заменить его правильно, но с soundmanager (под firefox) он не воспроизводится. Я нашел решение с urllib.quote, если вы хотите, я могу поделиться им. Спасибо :-) –

+0

Рад, что вы нашли решение. Из того, что вы написали, предположите, что это 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) дает тот же результат. Пожалуйста, поделитесь своим решением в ответе за всех. Благодарю. –

ответ

0

Как просил @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 

Я желаю решения полезно для тех, кто встретит.