Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2009 16:31:03

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

diam123
Ishodya iz etogo pochemu-to kajetsya chto problema imenno pri vivode v konsol`
Ещё раз тонко вам намекаю, что нет, проблема в другом.
alphaville
Привожу код:
OMG выкидывай lxml или ищите как его вразумить! Он уже возвращает уникодные строки с закодированными символами внутри - ужас.

Способ на время побороть:
print vakansii.encode('raw-unicode-escape')
Но срочно ищите альтернативу lxml или как его заставить так не делать.



Офлайн

#2 Окт. 14, 2009 16:36:34

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

ребята, тут то же самое без 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 )
посмотрите пожалуйста



Отредактировано (Окт. 14, 2009 16:37:33)

Офлайн

#3 Окт. 14, 2009 16:40:45

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

alphaville
ребята, тут то же самое без lxml:
Ну вот уже лучше - что логично. Теперь это обычная байтовая строчка в кодировке utf-8. С ней можно нормально работать.



Офлайн

#4 Окт. 14, 2009 16:41:08

clopomor
От:
Зарегистрирован: 2007-06-12
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

#!/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')



Офлайн

#5 Окт. 14, 2009 17:28:53

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

Daevaorn
Но срочно ищите альтернативу lxml или как его заставить так не делать.
давайте не будем трогать lxml :) очень хорошая библиотека, и по скорости и по простоте использования и
на грабли с кодировками, слава Богу, еще ни разу не наступил

хотите получить строку в определенной кодировке, так просто укажите ее :) у метода tostring есть параметр encoding

еще раз тему перечитал. возникли сомнения в плане оси, мы про виндовоз говорим?



Отредактировано (Окт. 14, 2009 17:32:20)

Офлайн

#6 Окт. 14, 2009 17:40:45

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

pyuser
Daevaorn
Но срочно ищите альтернативу lxml или как его заставить так не делать.
давайте не будем трогать lxml :) очень хорошая библиотека, и по скорости и по простоте использования и
на грабли с кодировками, слава Богу, еще ни разу не наступил

хотите получить строку в определенной кодировке, так просто укажите ее :) у метода tostring есть параметр encoding

еще раз тему перечитал. возникли сомнения в плане оси, мы про виндовоз говорим?
Дак как? Я хочу с ней работать! У вас получалось парсить ей кириллицу?



Офлайн

#7 Окт. 14, 2009 17:42:45

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

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



Офлайн

#8 Окт. 14, 2009 17:42:55

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

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. Можно ли выдачу привести к нормальному виду?



Офлайн

#9 Окт. 14, 2009 17:45:23

alphaville
От:
Зарегистрирован: 2009-07-17
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

В сотый раз про кодировки

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version