В 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 выводит байты „как есть“.