Найти - Пользователи
Полная версия: В сотый раз про кодировки
Начало » Python для новичков » В сотый раз про кодировки
1 2
alphaville
Всем добрый день. Перечитал всё что поиск выдал по запросу ‘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.

Помогите пожалуйста!
clopomor
читайте про encode/decode
коли ви отримуєте стрічку в змінну яка є юнікодною, вам необхідно декодувати з базового кодування - тобто з utf-8
при виводі вам необхідно зробити encode в кодування терміналу - cp866
alphaville
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' слова Курумоч.
Александр Кошелев
Код покажите или нам продолжать в стеклянный шар смотреть?
diam123
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…
Александр Кошелев
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. Надо увидеть код, чтобы понять почему так вышло.
pyuser
'\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”) тоже отображается без ошибок
diam123
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
alphaville
Привожу код:
# -*- 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 находится слово ‘Вакансии’.
diam123
U mnu netu lxml :(
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB