Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 14, 2010 19:35:35

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

И снова кодировки

Пытаюсь парсить страницу, на которой была вроде как cp1251:

page = urllib2.urlopen(self.source)

text = page.read().decode('cp1251').encode('utf-8')
#text = unicode(page.read(), 'cp1251', 'ignore')
output = cStringIO.StringIO(text)

print text

tree = html.parse(output)
root = tree.getroot()
news = root.cssselect('.news')[0]

self.text = news.cssselect('h3')[0].text

print self.text
В качестве парсера, как видно, lxml, из одной кодировки в другую как только не переводил. При простом парсинге без преобразования получается Îñíîâàòåëÿìè , причем это именно юникодные символы и они не преобразуются в cp1251, так как получается что-то в духе Îñíîâàòåëÿìè ðèýГ. Если же перекодировать - либо выдает ошибку перекодирования, либо кодировка падает после использования lxml, так как в text текст нормальный, юникодный, а после выборки по селектору в self.text опять находятся кракозябры. Юникодные. Что за ерунда, это lxml так шутит?



Офлайн

#2 Июнь 14, 2010 22:17:06

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

И снова кодировки

lxml вроде нормально должен кушать юникод. Может быть загвоздка кроется в StringIO, которому не положен юникод (не путать utf-8 и юникод!). То есть до lxml в твоем коде доходит utf-8 а не юникод.
Да и StringIO тут вообще лишняя сущность. Есть же метод для чтения из строк а не из файлового объекта (fromstring насколько я помню)



Офлайн

#3 Июнь 15, 2010 00:48:29

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

И снова кодировки

igor.kaist
у меня такое чувство, что там весь текст почему-то дважды юникодится. Вот, например, при таком раскладе:

page = urllib2.urlopen(self.source)
text = page.read().decode('cp1251').encode('utf-8')
tree = html.fromstring(text)
news = tree.cssselect('.news')[0]

self.text = news.cssselect('h3')[0].text

for abz in news.cssselect('p'):
self.text += abz.text

print self.text
выводится все то же барахло: ОснователямÐ



Офлайн

#4 Июнь 15, 2010 01:00:37

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

И снова кодировки

Все, справился, второй encode был не нужен.

page = urllib2.urlopen(self.source)
text = page.read().decode('cp1251')
tree = html.fromstring(text)
news = tree.cssselect('.news')[0]

self.text = news.cssselect('h3')[0].text



Отредактировано (Июнь 15, 2010 01:01:04)

Офлайн

#5 Июнь 15, 2010 07:08:42

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

И снова кодировки

Я же говорю, не путай утф-8 и юникод :) ты из ср1251 преобразовал в юникод а потом в утф-8



Офлайн

#6 Июнь 15, 2010 08:05:23

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

И снова кодировки

igor.kaist
это да, но если скормить lxml напрямую страницу в cp1251, вопреки заявлениям разработчиков о поддержке кодировок, на выходе будут кракозябры :)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version