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

Способ на время побороть:
print vakansii.encode('raw-unicode-escape')
Но срочно ищите альтернативу lxml или как его заставить так не делать.
alphaville
ребята, тут то же самое без 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 )
посмотрите пожалуйста
Александр Кошелев
alphaville
ребята, тут то же самое без lxml:
Ну вот уже лучше - что логично. Теперь это обычная байтовая строчка в кодировке utf-8. С ней можно нормально работать.
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')
pyuser
Daevaorn
Но срочно ищите альтернативу lxml или как его заставить так не делать.
давайте не будем трогать lxml :) очень хорошая библиотека, и по скорости и по простоте использования и
на грабли с кодировками, слава Богу, еще ни разу не наступил

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

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

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

еще раз тему перечитал. возникли сомнения в плане оси, мы про виндовоз говорим?
Дак как? Я хочу с ней работать! У вас получалось парсить ей кириллицу?
Александр Кошелев
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
alphaville
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. Можно ли выдачу привести к нормальному виду?
alphaville
html = lxml.html.document_fromstring(data.decode('utf8'))
СПАСИБО! ОТЛИЧНЫЙ ВАРИАНТ! как мне это в голову не пришло! сутки копаюсь с этими кодировками, а не делом занимаюсь. СПАСИБО!
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