Найти - Пользователи
Полная версия: кодировка и длинное тире
Начало » Python для новичков » кодировка и длинное тире
1
spirits25
Всем привет.

Есть строки, вида “\xd0\xb0 \u2013 \xd1\x83”, где \u2013 какой-то символ, в данном случае длинное тире. Вопрос, как от таких символов избавиться или перекодировать их? Потому что
e = "\xd0\xb0 \u2013 \xd1\x83"
print e.encode('iso-8859-1')
вызывает исключение
UnicodeEncodeError: ‘latin-1’ codec can't encode character u'\u2013' in position 4: ordinal not in range(256)
в то время как другие строки без этих символов выводит отлично.

Спасибо.
py.user.next
>>> e = "\xd0\xb0 \u2013 \xd1\x83"
>>> e = e.replace('\u2013', '')
>>> e
'\xd0\xb0  \xd1\x83'
>>>
spirits25
Это было первое, что я попробовал. Но это прокатило бы в случае простого текста.
Видимо для понимания нужно больше.

import urllib2, lxml.html
url = 'http://sport.mail.ru/news/olympics/13803168/'
f = urllib2.urlopen(url).read()
doc = lxml.html.document_fromstring(f)
q = doc.find_class('js-newstext text')[0]
s = q.text_content()
e = s[1560:1580]

In [11]: e
Out[11]: u'\xb1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb7\xd0\xb0 \u2013 \xd1\x83\xa0\xd1\x80\xd0'
In [12]: e.encode('iso-8859-1')
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
/home/spirit/<ipython console> in <module>()
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 12: ordinal not in range(256)
In [13]: e.replace('\u2013','')
Out[13]: u'\xb1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb7\xd0\xb0 \u2013 \xd1\x83\xa0\xd1\x80\xd0'
In [14]: e = s[1558:1580]
In [15]: print e[:14].encode('iso-8859-1')
 бронза

Как быть в этом случае? Какой должна быть регулярка или что вообще делать?

Спасибо.
JOHN_16
может банально так:
>>> su=u'12й34\u201356'
>>>
>>> print su
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp866.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2013' in position
 5: character maps to <undefined>
>>>
>>> print su.encode('latin', 'ignore')
123456
>>> print su.encode('latin', 'replace')
12?34?56
>>>
wmnpyafn
Просто нужно было указать в какой кодировке страница и тогда все нормально.
Вот, пробуй.
import urllib2
import lxml.html
url = 'http://sport.mail.ru/news/olympics/13803168/'
f = urllib2.urlopen(url).read().decode('utf8')
doc = lxml.html.document_fromstring(f)
q = doc.find_class('js-newstext text')[0]
s = q.text_content()
e = s[1560:1580]
print e

Тест выводится не в виде символов и если тебе нужно убрать тире, убирай его с помощью replace.
py.user.next
spirits25
Как быть в этом случае? Какой должна быть регулярка или что вообще делать?
если это возникло
>>> e = u'\xb1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb7\xd0\xb0 \u2013 \xd1\x83\xa0\xd1\x80\xd0'
>>> e
u'\xb1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb7\xd0\xb0 \u2013 \xd1\x83\xa0\xd1\x80\xd0'
>>> e.replace('\u2013', '')
u'\xb1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb7\xd0\xb0 \u2013 \xd1\x83\xa0\xd1\x80\xd0'
>>> e.replace(u'\u2013', u'')
u'\xb1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb7\xd0\xb0  \xd1\x83\xa0\xd1\x80\xd0'
>>>

но оно не должно возникать, потому что на ранних этапах нужно привести к одному виду все символы

wmnpyafn
f = urllib2.urlopen(url).read().decode('utf8')
вот из-за того что ты в одну строку записал, кодировку страницы из заголовков ответа нельзя узнать

>>> import urllib2
>>> data = urllib2.urlopen('http://www.yandex.ru')
>>> data.headers.getheader('content-type')
'text/html; charset=UTF-8'
>>>
wmnpyafn
Какую ты страницу парсишь и что из неё тебе вытащить нужно?
spirits25
Всем спасибо! Строка f = urllib2.urlopen(url).read().decode('utf8') работает отлично=)

Какую ты страницу парсишь и что из неё тебе вытащить нужно?
url = 'http://sport.mail.ru/news/olympics/13803168/' её и парсил.
Вопрос закрыт, спасибо.
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