Уведомления

Группа в Telegram: @pythonsu

#1 Июль 8, 2013 19:44:44

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

кодировка и длинное тире

Всем привет.

Есть строки, вида “\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)
в то время как другие строки без этих символов выводит отлично.

Спасибо.



Отредактировано spirits25 (Июль 8, 2013 19:45:11)

Офлайн

#2 Июль 8, 2013 20:38:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

кодировка и длинное тире

>>> e = "\xd0\xb0 \u2013 \xd1\x83"
>>> e = e.replace('\u2013', '')
>>> e
'\xd0\xb0  \xd1\x83'
>>>



Офлайн

#3 Июль 8, 2013 22:12:07

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

кодировка и длинное тире

Это было первое, что я попробовал. Но это прокатило бы в случае простого текста.
Видимо для понимания нужно больше.

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')
 бронза

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

Спасибо.



Офлайн

#4 Июль 9, 2013 00:30:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

кодировка и длинное тире

может банально так:

>>> 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
>>>



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Июль 9, 2013 01:38:25

wmnpyafn
Зарегистрирован: 2013-06-09
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

кодировка и длинное тире

Просто нужно было указать в какой кодировке страница и тогда все нормально.
Вот, пробуй.

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.

Офлайн

#6 Июль 9, 2013 02:24:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

кодировка и длинное тире

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'
>>>



Отредактировано py.user.next (Июль 9, 2013 02:30:30)

Офлайн

#7 Июль 9, 2013 06:43:03

wmnpyafn
Зарегистрирован: 2013-06-09
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

кодировка и длинное тире

Какую ты страницу парсишь и что из неё тебе вытащить нужно?

Офлайн

#8 Июль 9, 2013 15:16:57

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

кодировка и длинное тире

Всем спасибо! Строка f = urllib2.urlopen(url).read().decode('utf8') работает отлично=)

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version