Python, проблема?

pastebin.com/vjn4QeKv

почему этот кусок кода не работает?

нужна строка в юникоде, а оно выдает ошибку
  • Вопрос задан
  • 5846 просмотров
Пригласить эксперта
Ответы на вопрос 4
@marazmiki
Укротитель питонов
Винда, да? Попробуйте

print link_text.encode('UTF-8')
Ответ написан
buriy
@buriy
В Windows (включая Win7):
>>> import sys
>>> print sys.stdin.encoding
cp866
>>> print sys.stdout.encoding
cp866


Данная кодировка — это особенность виндового cmd.

Поэтому

print link_text.encode('cp866','replace')
даст в cp866 консоли русский текст, заменяя юникодные символы, которых нет в этой кодировке, на вопросик ("?").
При попытке вывести юникод, данная конверсия, но без замены плохих символов, запустится самостоятельно, и сломается, потому что там присутствуют символы, которые не могут быть представлены в cp866.
Как же найти эти символы?
>>> t=link_text.encode('cp866','replace').decode('cp866')
>>> for i in xrange(len(t)):
>>>      if link_text[i:i+1] != t[i:i+1]: link_text[i:i+1]
>>>
u'\xea'
u'\xab'
u'\xbb'
u'\xea'
u'\xea'
u'\xea'
u'\xea'
u'\xea'
u'\xea'
u'\xea'
u'\xea'
u'\xea'
u'\u2014'
>>> import htmlentitydefs
>>> for i in xrange(len(t)):
>>>     if link_text[i:i+1] != t[i:i+1]: htmlentitydefs.codepoint2name[ord(link_text[i:i+1])]
>>> 
'ecirc'
'laquo'
'raquo'
'ecirc'
'ecirc'
'ecirc'
'ecirc'
'ecirc'
'ecirc'
'ecirc'
'ecirc'
'ecirc'
'mdash'

В общем, как обычно — html entities.

Аналогичные проблемы могут быть в линуксе, при использовании не-utf8 консоли.
Например:
<source lang=«python>
>>> import sys
>>> sys.stdin.encoding
'KOI8-R'
>>> sys.stdout.encoding
'KOI8-R'
>>> e='привет'
>>> e
'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
>>> print e
привет
>>> e.decode('koi8-r') #добавил пробелы после каждой \u, для защиты от хабрапарсера
u'\u 043f\x a9\u 044f\u 2500\u 043f\u 2566\u 043f\u 2561\u 043f\u 2563\u 044f\u 250c'
>>> print e.decode('koi8-r')
привет


Как видите, при выводе уникода print конвертирует его в кодировку консоли, а при выводе не-юникода print выводит байты „как есть“.
Ответ написан
Комментировать
@Fak3
вы import urllib забыли?
import urllib
link='http://www.barcelona-nsk.ru/catalog/mebel/jacob-delafone/reve/mebel-pod-rakovinu-117x43,5x37sm-reve'
link_text = unicode(''.join(urllib.urlopen(link).readlines()), 'utf-8')
print link_text
Ответ написан
seriyPS
@seriyPS
какой код чудной)))

Зачем джойнить вывод readlines если можно сделать read().replace('\n', '')?

Я бы в общем записал как-то так
import urllib
link='http://www.barcelona-nsk.ru/catalog/mebel/jacob-delafone/reve/mebel-pod-rakovinu-117x43,5x37sm-reve'
body=urllib.urlopen(link).read().replace('\n', '').decode('utf8')
Хотя возможно и дело вкуса…

А так вам правильно посоветовали см habrahabr.ru/blogs/python/117236/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы