Форумы сайта python.su
Вы не зашли.

Всем добрый день. Перечитал всё что поиск выдал по запросу '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.
Помогите пожалуйста!
Неактивен
читайте про encode/decode
коли ви отримуєте стрічку в змінну яка є юнікодною, вам необхідно декодувати з базового кодування - тобто з utf-8
при виводі вам необхідно зробити encode в кодування терміналу - cp866
Отредактированно clopomor (2009-10-14 16:07:52)
Неактивен

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' слова Курумоч.
Неактивен
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 (2009-10-14 16:51:42)
Неактивен
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. Надо увидеть код, чтобы понять почему так вышло.
Неактивен
'\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") тоже отображается без ошибок
Неактивен
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...
Неактивен

Привожу код:
# -*- 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 написал:
Ishodya iz etogo pochemu-to kajetsya chto problema imenno pri vivode v konsol`
Ещё раз тонко вам намекаю, что нет, проблема в другом.
alphaville написал:
Привожу код:
OMG выкидывай lxml или ищите как его вразумить! Он уже возвращает уникодные строки с закодированными символами внутри - ужас.
Способ на время побороть:
print vakansii.encode('raw-unicode-escape')Но срочно ищите альтернативу lxml или как его заставить так не делать.
Неактивен

ребята, тут то же самое без lxml:
# -*- coding:utf-8 -*-
import httplib, urllib
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()
data = data.split("""company.yandex.ru/inside/job/">""")[1]
data = data.split("</a>")[0]
print repr( data )посмотрите пожалуйста
Отредактированно alphaville (2009-10-14 17:37:33)
Неактивен
alphaville написал:
ребята, тут то же самое без lxml:
Ну вот уже лучше - что логично. Теперь это обычная байтовая строчка в кодировке utf-8. С ней можно нормально работать.
Неактивен
Daevaorn написал:
Но срочно ищите альтернативу lxml или как его заставить так не делать.
давайте не будем трогать lxml
очень хорошая библиотека, и по скорости и по простоте использования и
на грабли с кодировками, слава Богу, еще ни разу не наступил
хотите получить строку в определенной кодировке, так просто укажите ее
у метода tostring есть параметр encoding
еще раз тему перечитал. возникли сомнения в плане оси, мы про виндовоз говорим?
Отредактированно pyuser (2009-10-14 18:32:20)
Неактивен

pyuser написал:
Daevaorn написал:
Но срочно ищите альтернативу lxml или как его заставить так не делать.
давайте не будем трогать lxml
очень хорошая библиотека, и по скорости и по простоте использования и
на грабли с кодировками, слава Богу, еще ни разу не наступил
хотите получить строку в определенной кодировке, так просто укажите ееу метода tostring есть параметр encoding
еще раз тему перечитал. возникли сомнения в плане оси, мы про виндовоз говорим?
Дак как? Я хочу с ней работать! У вас получалось парсить ей кириллицу?
Неактивен
pyuser написал:
давайте не будем трогать lxml smile
Нет позвольте, я всё-таки трону.
lxml.html неправильно обрабатывает входной поток байт, что отчетливо видно в ситуации топик-стартера. Он преобразует в уникод быйты, не декодируя кодировку.
Если на вход document_fromstring подать уже уникодную строчку, то всё будет лучше:
html = lxml.html.document_fromstring(data.decode('utf8'))Так наверно лучше всего и поступать. Но всё-равно странное поведение.
pyuser написал:
хотите получить строку в определенной кодировке, так просто укажите ее smile у метода tostring есть параметр encoding
У HtmlElement нету tostring метода.
pyuser написал:
еще раз тему перечитал. возникли сомнения в плане оси, мы про виндовоз говорим?
alphaville написал:
File "C:\Python25\lib\encodings\cp866.py", line 12, in encode
Неактивен

clopomor написал:
Код:
#!/usr/bin/python # -*- coding: utf-8 -*- s = '\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87' s1 = unicode(s,"UTF-8") print s1.encode('utf-8')
только последняя строчка print s1.encode('cp866')
так действительно всё работает. Но это второй вариант. А в первом, где используется lxml отдаётся строка u'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87'.
Тоесть какая-то полная хрень. Я не хочу отказываться от lxml. Можно ли выдачу привести к нормальному виду?
Неактивен

html = lxml.html.document_fromstring(data.decode('utf8'))СПАСИБО! ОТЛИЧНЫЙ ВАРИАНТ! как мне это в голову не пришло! сутки копаюсь с этими кодировками, а не делом занимаюсь. СПАСИБО!
Неактивен