Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 23, 2009 11:55:07

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

раньше помогало “import codecs” теперь нет ;(
как только доходит до русской буквы сразу обрубает …



Офлайн

#2 Дек. 23, 2009 11:56:54

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

Что, поискать по форуму по поводу кодировок не судьба?

Офлайн

#3 Дек. 23, 2009 12:02:10

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

весь форум в вопросах о кодировке. может хотя бы напишешь исходник?



Отредактировано (Дек. 23, 2009 12:02:40)

Офлайн

#4 Дек. 23, 2009 13:39:16

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

import urllib
f = urllib.urlopen("http://hotline.ua/“)
s = f.read()
print s
f.close()


вот для начала хотя бы спарсерить код …

если (”http://hotline.ua/“) поменять на (”http://python.org/") то все работает …



Офлайн

#5 Дек. 23, 2009 13:50:47

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

Ferroman
Что, поискать по форуму по поводу кодировок не судьба?
если бы мне ДАЖЕ с тем что на форуме(в теме http://python.su/forum/viewtopic.php?pid=9144#p9144) не выдавало :


Traceback (most recent call last):
File “C:\Python26\Lib\SITE-P~1\PYTHON~1\pywin\framework\scriptutils.py”, line 312, in RunScript
exec codeObject in __main__.__dict__
File “C:\parser\proba 111111\teranian.py”, line 5, in <module>
print s
File “C:\Python26\lib\codecs.py”, line 351, in write
data, consumed = self.encode(object, self.errors)
File “C:\Python26\lib\encodings\cp866.py”, line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xd6 in position 143: ordinal not in range(128)

при том, что как в ТОПИКЕ написано, поменял код на :

# -*- coding: cp1251 -*-

import codecs, sys
import urllib


outf = codecs.getwriter('cp1251')(sys.stdout, errors='replace')
sys.stdout = outf


f = urllib.urlopen("http://hotline.ua/")
s = f.read()
print s
f.close()



Отредактировано (Дек. 23, 2009 13:53:21)

Офлайн

#6 Дек. 23, 2009 14:05:43

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

У меня вообще код, который ты привел в посте #4 работает (всмысле ошибки не выдает, но вместо русского текста не то, что надо). Обычно в http-заголовках передается кодировка. Ты можешь вытащить ее оттуда и с помощью .decode('то что ты нашел в заголовках').encode('utf-8') получить строку в utf-8. Ну или используй chardet для определения кодировки.



Офлайн

#7 Дек. 23, 2009 14:29:21

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

expee
У меня вообще код, который ты привел в посте #4 работает (всмысле ошибки не выдает, но вместо русского текста не то, что надо). Обычно в http-заголовках передается кодировка. Ты можешь вытащить ее оттуда и с помощью .decode('то что ты нашел в заголовках').encode('utf-8') получить строку в utf-8. Ну или используй chardet для определения кодировки.
собственно проблему решил следующим образом (правда не так как советовали ):
import urllib



f = urllib.urlopen("http://hotline.ua/")
s = f.read()
print s.decode("cp1251")
f.close()



Офлайн

#8 Дек. 23, 2009 14:33:29

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

Да, но неизвестно, в какой кодировке сервер отдаст тебе страницу (если только не планируешь работать только с этим сайтом). Так что лучше смотреть кодировку в заголовке, а не указывать явно.



Отредактировано (Дек. 23, 2009 14:35:39)

Офлайн

#9 Дек. 23, 2009 14:42:39

sonniy
От:
Зарегистрирован: 2009-12-18
Сообщения: 84
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

expee
Да, но неизвестно, в какой кодировке сервер отдаст тебе страницу (если только не планируешь работать только с этим сайтом). Так что лучше смотреть кодировку в заголовке, а не указывать явно.
1.данный код проверил , работает нормально выдает в том виде котором надо и без крякозябрр (знаков вопросов или квадратиков заместь буковак)
2.насамом деле планирую работать с схожими сайтами такойже структуризации и кодировки

З.Ы.
expee
Ну или используй chardet для определения кодировки.
не понял как ето зделать
пользуюсь вот этой книгой (ненашол ни чего на тему chardet) или я не понял предложения =) :
http://0day.kiev.ua/modules.php?name=News&file=view&news_id=57314&search=python



Офлайн

#10 Дек. 23, 2009 14:49:28

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Вечный error с русскими значениями

sonniy
не понял как ето зделать
http://chardet.feedparser.org/ там примеры есть. но в твоем случае, думаю, можно обойтись и без нее. просто, может на будущее пригодится (у меня была проблема, где сервер не всегда отдавал кодировку, а контент был на разных языках (не только рус.))

Я не сомневаюсь, что у тебя с этим сайтом оно работает, но если планируешь работать с другими, то они могут отдавать тебе страницу в utf-8, koi8-r, а не только в windows-1251. А вообще кодировку можно узнать, как я уже писал выше, из заголовка Content-Type (в твоем случае - f.headers).



Отредактировано (Дек. 23, 2009 14:51:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version