Форум сайта python.su
Всем доброго времени суток!
Возникла проблема, на решая которую потратил вот уже несколько часов.
Суть примерно следующая.
Есть url, содержащий кириллические символы. Например: http://спортмат.рф/products/Спортмат_Детский_мат_500х500х50_мм
Необходимо открыть данный url при помощи urlopen
Делаю так:
from urllib2 import urlopen
url=u"http://спортмат.рф/products/Спортмат_Детский_мат_500х500х50_мм"
a = urlopen(url)
Офлайн
urlopen требует только латинские буквы.
Преобразовать можно так:
import re, urlparse
def urlEncodeNonAscii(b):
return re.sub('[\x80-\xFF]', lambda c: '%%%02x' % ord(c.group(0)), b)
def iriToUri(iri):
parts= urlparse.urlparse(iri)
return urlparse.urlunparse(
part.encode('idna') if parti==1 else urlEncodeNonAscii(part.encode('utf-8'))
for parti, part in enumerate(parts)
)
>>> iriToUri( u"http://спортмат.рф/products/Спортмат_Детский_мат_500х500х50_мм" )
'http://xn--80axfdgdkc.xn--p1ai/products/%d0%a1%d0%bf%d0%be%d1%80%d1%82%d0%bc%d0%b0%d1%82_%d0%94%d0%b5%d1%82%d1%81%d0%ba%d0%b8%d0%b9_%d0%bc%d0%b0%d1%82_500%d1%85500%d1%8550_%d0%bc%d0%bc'
Офлайн
для питона 2.7 нужно объявлять кодировку в начале исходного файла, если в скрипте есть символы, не входящие в ascii
>>> import urllib
>>> s = u'http://www.site.com/абвг/defg'
>>> s
u'http://www.site.com/\u0430\u0431\u0432\u0433/defg'
>>> t = urllib.splittype(s)
>>> es = u':'.join((t[0], urllib.quote(t[1].encode('utf-8'))))
>>> es
u'http://www.site.com/%D0%B0%D0%B1%D0%B2%D0%B3/defg'
>>>
>>> import urllib
>>> s = u'http://www.site.com/абвг/defg'
>>> s
u'http://www.site.com/\u0430\u0431\u0432\u0433/defg'
>>> t = urllib.splittype(s)
>>> es = t[0] + u':' + urllib.quote(t[1].encode('utf-8'))
>>> es
u'http://www.site.com/%D0%B0%D0%B1%D0%B2%D0%B3/defg'
>>>
Отредактировано (Янв. 19, 2012 23:13:01)
Офлайн