22 февр. 2010 г.

Трудности кодировок

Вчера вечером, совершенно неожиданно, пришла в голову мысль сделать кросспостинг этого блога в систему ВКонтакте.ру. Поскольку наработки у меня уже были, я решил, что это дело будет весьма легким. Но как я ошибался, кто бы знал.
Проблемы начались с парсинга RSS потока. В Питоне есть гениальная и простая библиотека feedparser. Все советуют ее использовать и по всему интернету разбросаны примеры ее использования. Но, есть один нюанс. Эта библиотека написана для версии питона 2. Я пытался ее сконвертировать для работы с третьей версией и она даже стала запускаться, но заглючила притащеная ей библиотека SGMLParser. Самое противное, что на сайте у этих ребят нигде не написано, что она предназначена исключительно для питона 2. Я был разочарован. В итоге пришлось побыстрому набросать свой собственный парсер на основе библиотеки minidom.
Дальше больше. Теперь у меня был прекрасно распарсеный RSS фид. Осталось самое малое - запостить его ВКонтакт. И вот тут меня ожидал еще один неприятный сюрприз. Фид у меня в кодировке UTF8, а ВКонтакт ожидает данные в формате CP1251 (дикие люди, весь мир уже давно перешел на UTF8). Это простое несовпадение кодировок, стоило мне многих часов упорного труда. В итоге, я лег в 5:30 утра, усталый и злой, так как не смог заставить питон посылать то, что мне надо (вернее в той кодировке, которая нужна).
Встав в 11 утра, я твердо решил добить этот вопрос. Вооружившись снифером и такой-то матерью, я вышел на бой с ненавистными кракозябрами. Теперь я в совершенстве знаю, как в Питоне представляются строки, байты, кодировки и как они посылаются на сайты в любых запросах. К двум часам дня, кодировки были побеждены.
Пришлось опять самому писать перекодирование (escaping) CP1251 символов для POST реквеста, так как стандартный Питоновский модуль нагло продолжал конвертировать мой текст в UTF8. Универсальность не всегда хороша, как оказалось.
Что в итоге: есть скрипт, который берет RSS фид этого блога, определяет появились ли новые статьи, и если появились, постит их ВКонтакт, убирая предварительно весь HTML (кстати стандартного striptags в Питоне тоже нет, пришлось искать сторонний - опять для питона 2 - и конвертить его для тройки).

Выводы:
1. Отпуск до добра не доводит
2. Питон 3 еще долго будет порабощать мир - слишком велик вес питона 2
3. Еще раз убедился, что документация для Питона бедновата
4. Справедливости ради стоит признать, что Питон - очень мощный язык

P.S.: На лекции по Питону в универе у меня прозвучала фраза: Анаконда написана на Питоне. Красиво:)

Комментариев нет:

Отправить комментарий