Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2009 15:01:28

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

Всем добрый день. Перечитал всё что поиск выдал по запросу ‘unicode’ но верного решения не нашёл.

Итак, в первой строчке файла прописано # -*- coding:utf-8 -*-

Программа скачивает страницу, парсит её через xpath. Страница в кодировке utf-8. Получаю таким образом строку русскоязычную и хочу её вывести.

len строки 14
type строки <type ‘unicode’>
строка вообще представляет собой слово Курумоч

попытка вывести в консоль строку командой print выдаёт:

Traceback (most recent call last):
File "ut.py", line 175, in <module>
ut('','','','')
File "ut.py", line 168, in ut
ut_chain_lookup(data,x)
File "ut.py", line 86, in ut_chain_lookup
print n.text_content().strip()
File "C:\Python25\lib\encodings\cp866.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-13: ch
aracter maps to <undefined>
вывод функции repr говорит что строка представляет собой:
u'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87'
Перепробывал различные варианты encode, decode с кодировками cp866 и utf-8.

Помогите пожалуйста!



Офлайн

#2 Окт. 14, 2009 15:04:59

clopomor
От:
Зарегистрирован: 2007-06-12
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

читайте про encode/decode
коли ви отримуєте стрічку в змінну яка є юнікодною, вам необхідно декодувати з базового кодування - тобто з utf-8
при виводі вам необхідно зробити encode в кодування терміналу - cp866



Отредактировано (Окт. 14, 2009 15:07:52)

Офлайн

#3 Окт. 14, 2009 15:08:15

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

clopomor
читайте про encode/decode
коли ви отримуэте стрычку в змынну яка э юныкодною, вам необхыдно декодувати з базового кодування - тобто з utf-8
при виводі вам необхідно зробити encode в кодування термыналу - cp866
Извините, мало что понял. Я перепробывал все возможные варианты encode/decode с utf-8 и cp866.

Прошу читателей попытаться добиться различными вариациями получения из строки u'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87' слова Курумоч.



Офлайн

#4 Окт. 14, 2009 15:20:57

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

Код покажите или нам продолжать в стеклянный шар смотреть?



Офлайн

#5 Окт. 14, 2009 15:48:29

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

Proshu prosheniya za translit…
Kod mojete ne pokazivat - u vas oshibka vilazit ne pri perekodirovanii iz utf-8, a pri otobrajenii v vindovoy console. Tam je napisano cp866…
Vi v fayl zapishite, i uvidite chto vse ok…
P.S. utf-8 toje bivaet razniy, naprimer v standartnoy biblioteke est takaya kodirovka kak utf_8_sig, poprobuyte esche i ee, ona chasto vstrechaetsya, u menya i u nekotorih znakomih bila podobnaya problema, chto vrode bi utf8, a vrode bi i net…



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

Офлайн

#6 Окт. 14, 2009 15:59:26

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

diam123
Kod mojete ne pokazivat - u vas oshibka vilazit ne pri perekodirovanii iz utf-8, a pri otobrajenii v vindovoy console
Значит у вас всё-таки хороший стеклянный шар? Нет.
alphaville
u'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87'
Это не уникодные символы внутри, а utf-8. Надо увидеть код, чтобы понять почему так вышло.



Офлайн

#7 Окт. 14, 2009 15:59:44

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87' не похоже на юникод, поэтому символ ‘u’ явно лишний :(
в win-консоли без всяких ошибок выводится ‘\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87’.decode(“utf-8”) и ‘\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87’.decode(“utf-8”).encode(“cp866”) тоже отображается без ошибок



Офлайн

#8 Окт. 14, 2009 16:10:40

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

Daevaorn
diam123
Kod mojete ne pokazivat - u vas oshibka vilazit ne pri perekodirovanii iz utf-8, a pri otobrajenii v vindovoy console
Значит у вас всё-таки хороший стеклянный шар? Нет.
alphaville
u'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87'
Это не уникодные символы внутри, а utf-8. Надо увидеть код, чтобы понять почему так вышло.
Inogda podrabativayu telepatom )

C:\Python25\lib\encodings\cp866.py
Ishodya iz etogo pochemu-to kajetsya chto problema imenno pri vivode v konsol`
Topikstarter (bolee chem uveren) daje ne smotrit na to, menyaesya li oshibka ili net, a pri ego operaciyah ona 100% doljna menyatsya.
Poprobovat vivesti v fayl on toje ne hochet
Poeksperimentirovat s utf_8_sig toje net (A mejdu prochim utf_8_sig eto UTF8 s signaturoy, kotoraya nahoditsya kak raz v samom nachale fayla, i skoree vsego imenno ee ne mojet otobrazit vindovaya konsol`).
Topikstarteru - nezachet za maliy ob`em informacii, to chto ne daet kod to podrazumevaet pod soboy megoprevad ego raboti =/
P.S. Takie problemi ne voznikayut u teh, kto sledit za kodirovkami



Офлайн

#9 Окт. 14, 2009 16:11:26

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

Привожу код:

# -*- coding:utf-8 -*-
import httplib, urllib
import lxml.html

host = 'www.yandex.ru'

headers = {'Host':host,
'User-agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'ru,en-us;q=0.7,en;q=0.3',
'Accept-Charset': 'windows-1251,utf-8;q=0.7,*;q=0.7',
'Keep-Alive': '300',
'Connection': 'keep-alive'}

conn = httplib.HTTPConnection(host)

conn.request('GET', '/',{},headers)

resp = conn.getresponse()
print resp.status

data = resp.read()

html = lxml.html.document_fromstring(data)

vakansii = html.xpath("id('foot')/table/tr/td[4]/a[3]")[0].text_content().strip()

print repr( vakansii )
Парсит главную страницу яндекса и в переменной vakansii находится слово ‘Вакансии’.



Офлайн

#10 Окт. 14, 2009 16:29:20

diam123
От:
Зарегистрирован: 2008-10-23
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

U mnu netu lxml :(



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version