Найти - Пользователи
Полная версия: И снова кодировки
Начало » Python для новичков » И снова кодировки
1
Enchantner
Пытаюсь парсить страницу, на которой была вроде как 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 так шутит?
igor.kaist
lxml вроде нормально должен кушать юникод. Может быть загвоздка кроется в StringIO, которому не положен юникод (не путать utf-8 и юникод!). То есть до lxml в твоем коде доходит utf-8 а не юникод.
Да и StringIO тут вообще лишняя сущность. Есть же метод для чтения из строк а не из файлового объекта (fromstring насколько я помню)
Enchantner
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
выводится все то же барахло: ОснователямÐ
Enchantner
Все, справился, второй 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
igor.kaist
Я же говорю, не путай утф-8 и юникод :) ты из ср1251 преобразовал в юникод а потом в утф-8
Enchantner
igor.kaist
это да, но если скормить lxml напрямую страницу в cp1251, вопреки заявлениям разработчиков о поддержке кодировок, на выходе будут кракозябры :)
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