Избранное Хабра в PDF

    Всех с наступившими!

    image

    Так как я люблю все упорядочивать и каталогизировать, давно вертелась мысль завернуть избранные топики с хабра в PDF и отсортировать по датам.
    Собственно выделилось немного свободного времени в праздники, решил задуманное осуществить и поделиться с хабром

    UPD:
    — Исправлена ошибка «too large on page» (подробнее на github) Спасибо Bifidokk и StreetAngel
    — Авторы топиков сделаны ссылкой
    — Добавлена возможность сохранять избранное только из указанных блогов



    Для работы скрипта требуется python-pisa
    Работу под windows к сожалению не тестировал, нет поблизости

    Порядок запуска:

    Редактируем fav2pdf.py под ваши нужды

    user = 'vrtx' - имя пользователя
    site = user + '.habrahabr.ru'
    from_date = '1 января 2011' - дата, с которой брать топики
    to_date = '' - дата, по которую брать топики


    Запускаем

    python fav2pdf.py

    Вывод будет приблизительно следующий

    Processed page 1 of 25:
    ----------------------
    1 Topic: Переводы->50 цитат о программировании всех времён
    2 Topic: Android->[Программирование] Работа со строкой состояния в Android
    3 Topic: Mobile Development->Пошаговое описание создания простого приложения для Samsung Bada
    4 Topic: Ненормальное программирование->Brainfuck и счастливые билеты
    Topic: ХабраЮмор->Трое В Серверной, Версия 1.0, Новогодняя Редакция is locked!
    ----------------------

    Prepare PDF...


    В итоге рядом со скриптом получим файлик с названием вашего ника в формате pdf

    Особенности:
    • Заглавная страница с содержанием
    • Заголовок топика ведет на топик на хабре
    • Страницы вытягиваются из мобильной версии хабра
    • Возможность ограничивать выборку по датам, можно вести например личный хабражурнал :)
    • Возможность вытаскивать избранное любого пользователя

    К сожалению, топики в избранном отсортированы по дате добавления туда, а не по дате публикации, поэтому пришлось перебирать полностью все избранное,
    что хоть и не сильно сказывается на скорости (чтение при 256k порядка 230 топиков ~ за 3 мин), но неприятно.

    Минусы:
    • Не читает закрытые блоги (требуется логин)
    • Надеюсь из временных минусов — глюки с отображением содержимого тега pre (нативная подсветка синтаксиса), редко кто ей пользуется из авторов, но все же
    • Также могут быть другие огрехи в отображении из-за ограниченной поддержки CSS в PISA
    • pisa-parser не видит ссылки на изображения, содержащие кириллицу
    • Не делал никаких «защит от дурака»

    Пока минусов больше не нашел, но любом случае, те что упомянул, встретились в моих избранных, а это не много не мало 230 топиков + тестировал на нескольких пользоватеях

    image

    Кому все еще интересно, ссылка на github

    Инструкция для запуска скрипта под Windows, спасибо desiderata:

    1. Ставим Python 2.7.1 x86 (под версией 3.0 и выше скрипт не работает, под x64 проблемы с _imaging)
    2. Ставим pisa 3.0.31 и необходимые для неё модули:
    Часть модулей устанавливается через Windows Installer,
    часть командой C:\python27\python.exe setup.py install
    ReportLab Toolkit 2.5, html5lib 0.9, PyPdf 1.13, PIL 1.1.7, setuptools 0.6c11, pisa 3.0.33.
    3. Патчим C:\Python27\Lib\site-packages\PIL\Image.py согласно комментарию.
    4. Редактируем fav2pdf.py по инструкции в посте.
    5. C:\Python27\python.exe fav2pdf.py
    6. PROFIT и спасибо Автору.


    P.S. По окончанию работы скрипт всётаки выдал ошибку в pisa_document.py", line 229, in pisaDocument
    Тем не менее PDF файл успешно создался и содержит все статьи из избранного.

    PS
    Если при работе скрипта вылезет похожая ошибка, лечится патчем PIL:
    File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1498, in split
    if self.im.bands == 1:
    AttributeError: 'NoneType' object has no attribute 'bands'

    Решение:
    # HG changeset patch -- Bitbucket.org
    # Project pil-2009-raclette
    # URL bitbucket.org/effbot/pil-2009-raclette/overview
    # User Fredrik Lundh <fredrik@effbot.org>
    # Date 1272193085 -7200
    # Node ID fb7ce579f5f96f7d9008f72ab03eef4f1c6db609
    # Parent 45c2debe0fc3d9632372a15826b1b64a35ff43c4
    Fixed split after open bug (regression in 1.1.7).

    --- a/PIL/Image.py
    +++ b/PIL/Image.py
    @@ -1494,11 +1494,11 @@ class Image:
    def split(self):
    "Split image into bands"

    + self.load()
    if self.im.bands == 1:
    ims = [self.copy()]
    else:
    ims = []
    - self.load()
    for i in range(self.im.bands):
    ims.append(self._new(self.im.getband(i)))
    return tuple(ims)


    PS2
    Совсем не силен в регулярках, если кто-то подскажет более оптимальные выражения, буду благодарен.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 113
    • НЛО прилетело и опубликовало эту надпись здесь
      • +9
        Спасибо! Статья очень полезна.
        Вы меня направили на путь, сделать такое же только на C++.
        • –2
          И попробую у себя сделать в CHM
          • +22
            Не надо. CHM, как бы так сказать, немного мёртвый формат, и полностью ненужен при наличии PDF. Делайте в PDF.
            • +5
              Хорошо! Завтра поеду за видяхой, а в понедельник буду искать некоторую инфу и начинать собирать проект.
              • +3
                Посмотрите в сторону Qt. В наличии:
                — WebKit в качестве рендера
                — PDF принтер в комплекте
                — поддержка БД, можно сразу делать каталог
                • 0
                  сделайте fb2, владельцам электронных читалок на радость
                  • +2
                    И epub для stanz'ы?:) А лучше поработать с evernote api и нужные статьи перенести туда, благо клиенты под любую ось есть.

                    На самом деле, избранное так захламлено, как и любые другие закладки, нужна кнопочка почистить всё избранное, а то там с 2007 столько накопилось и уже не актуального, но это уже в адрес хабрАдминам.
            • 0
              Было бы интересно посмотреть)
            • +19
              А потом издать книгу…
              • 0
                А материалы не принадлежат хабрахабру или авторам? Придётся договариваться.
                • +3
                  Прошу прощения, посмотрел соглашение, видимо все статьи принадлежат авторам. Придётся договариваться лично с каждым :)
                  • +2
                    Ну это ж для личного пользования, не?
                    • 0
                      Ну либо попросить всех поставить CC плашку.
                • +9
                  Счас как начнется хабраэффект хабру…
                  • +28
                    Кстати, было бы неплохо если бы выпускался ежемесячный журнал с лучшими постами хабра. Яб даже подписался на такое ) Жаль, минусовать в журнале не получится ))))
                    • +2
                      Отличная идея для сервиса:
                      Выбираете частоту генерации журнала, выбираете любимый формат, вводите e-mail и готово!
                      • +7
                        Печатать QR-коды с id выпуска\статьи, переходы засчитывать как ± в карму ))
                        Хм.
                        • +10
                          На то статьи и лучшие, чтобы их не минусовать уже )
                          • 0
                            У меня точна такая же идея была…
                            В Украине есть такая газета «Компьютер». Так вот в последняя время им нету чего писать. Если бы они печатали по 10 топиков, я бы покупал их чаще ;)
                            • +3
                              был же хабрадайжест. разве не то?
                              • +1
                                habradigest.ru но вроде проект помер
                              • +9
                                Неделя Python на Хабре)
                                • +3
                                  Не пользуйтесь дропбоксом в качестве хостинга картинок для хабра, забанят же за количество запросов.
                                  • 0
                                    Я так всегда делал, даже картинка из новогоднего поздравления, которое висело на главной и было много раз прочитано, и та хостилась на дропбоксе. Или у вас есть личный негативный опыт?
                                    • +3
                                      всего лишь верю опыту других пользователей:)
                                      habrahabr.ru/blogs/webdev/111202/#comment_3545860
                                      • +1
                                        Спасибо, интересный топик.
                                        Насколько я из него понял, если не использовать дропбокс в коммерческих целях (например, используя его API сделать файлхостинг платный или прикрутить его к сайту, с целью отдачи через дропбокс файлов пользователям), то все нормально будет.
                                        По крайней мере, меня до сих пор не забанили, а я в своих примерно 10-15 топиках точно использовал дропбокс.
                                        А вот некий сервис пикуча.ру, который мне раньше нравился, спустя примерно полтора года, ничтоже сумняшеся удалил все мои картинки со своего сайта. :(
                                        • 0
                                          дровбокс живёт на амазоне в облаке,
                                          на амазоне есть плата за запросы.
                                          большое количество запросов не выгодно создателям дропбокса.
                                          • +3
                                            aws.amazon.com/s3/#pricing
                                            $0.01 per 10,000 Requests — не думаю, что Хабр способен обанкротить DropBox)
                                            • +2
                                              Помнится была статистическая статья на Хабре. Ссылку дать не могу, не получается ее найти.
                                              Согласно ей, дропбокс с самого интересного топика на Хабре с картинкой потеряет не более 20-30 центов, а то и меньше.
                                              Ну а количество настолько интересных топиков не так уж и велико. :)
                                            • 0
                                              И не только за запросы, но и за трафик, 15 центов за гиг, кажется.
                                      • +3
                                        Да вроде с предыдущим топиком продержался, зато изображения по истечении времени не удаляются. И согласен с комментом ниже, интересует негативный опыт использования, не хотелось бы быть там забаненым…
                                      • 0
                                        О_о, в хабре есть избранное! Нужно почаще заходить в свой профиль)
                                        • +3
                                          Автора топика в pdf-ах тоже можно сделать ссылочкой на его хабрацентр
                                          • 0
                                            да можно, постараюсь на выходных еще пару мыслей доделать. А еще лучше складывайте их на гитхабе, по мере появления времени буду делать.
                                          • 0
                                            Спасибо за наводку на python-pisa, давно думал чем бы заменить перловый html2ps, но все руки не доходили поискать.
                                            • 0
                                              Что-то у него с кирилическими шрифтами не того :( Ладно, будет время разберемся.
                                              • 0
                                                Да, есть такое) нужно цеплять в цсске отдельно шрифты. Да и в целом в писе ограничений немало, хотя если нет охоты возиться с самим ReportLab то и это пойдет
                                                • 0
                                                  ReportLab я тоже забукмаркал :) Наша система сама эти документы генерирует, так-что промежуточное звено (HTML) вполне можна выкинуть.
                                            • 0
                                              У меня была идея что-то типа HabraMag я также верстать собрался уже… а потом подумал, народ может негативно отнестись, да и Администрация не знаю как ответит на это… да и нужно мне еще 1-2 человека, для подготовки контента.
                                              Если бы я уверен что прокатит, я бы уже наконец дорисовал набросок журнала)))
                                            • 0
                                              Объясните как воспользоваться фиксом.
                                              • 0
                                                Черт, отправилось. Правлю файл /usr/lib/python2.6/dist-packages/PIL/Image.py
                                                Нахожу строчку с def split(self):

                                                Как там что править? Может кто нибудь выложить уже исправленный этот блок?
                                                • +2
                                                  def split(self):
                                                  «Split image into bands»
                                                  self.load()
                                                  if self.im.bands == 1:
                                                  ims = [self.copy()]
                                                  else:
                                                  ims = []
                                                  for i in range(self.im.bands):
                                                  ims.append(self._new(self.im.getband(i)))
                                                  return tuple(ims)
                                                  • +2
                                                    self.load() перенеси выше
                                                    • +2
                                                      во программисты пошли… Уже патчить разучились…
                                                    • +1
                                                      блин, напугали, думал скрипт так сверстал)
                                                      • 0
                                                        Был уже когда-то habradigest
                                                        • 0
                                                          пока набросок… но если были бы предложения то думаю можно было бы сверстать пару выпусков, а если было бы популярное, то выпускали бы постоянно…
                                                          • 0
                                                            Вообще журнал на основе статей с хабра это идея интересная, но думаю основная ее проблема в том, что так как хабр довольно разносторонний, сложно будет найти основную тему журнала
                                                            • 0
                                                              А что мешает просто помещать туда лучшие статьи?
                                                              • 0
                                                                Да собственно ничего, просто получится еще один habradigest и, боюсь, его постигнет та же участь(
                                                                • 0
                                                                  Если будут заинтересованы люди, кто ж мешает, можно и писать статьи специально для журнала… + может статьи или уроки более обширные, развернутые.
                                                                  В общем я предложил) Если что — пишите письма.
                                                                  • 0
                                                                    Вот бы сюда что то вроде создания книг от wiki прикрутить…
                                                          • 0
                                                            Обработал все посты, судя по логу, а потом выдал:
                                                            Prepare PDF…

                                                            No handlers could be found for logger «ho.pisa»
                                                            • 0
                                                              Prepare PDF…
                                                              в этот момент идет сборка пдф файла, дальше могут идти ошибки, подробнее их можно посмотреть если расскомментировать в pdf_gen.py строчку #pisa.showLogging(). 99% там будут ошибки о том, что какой-то картинки уже не существует HTTPError: HTTP Error 404: Not Found, что актуально для старых топиков. Из-за этого на процесс сборки уходит больше времени. Например на все мое избранное ушло порядка 20 минут только на одну сборку, поэтому лучше сохраняться с интервалом
                                                              • 0
                                                                а сама pdf генерится?
                                                                • 0
                                                                  Попробовал сгенерить пдфку с вашим избранным, после где-то 30 минут выдал пдфку, 34мб избранного :)
                                                                  • 0
                                                                    Я поначалу просто подумал что она зависла. Раскомментировал как вы сказали, вроде процесс пошел, судя по вылетающим ошибкам. А почему так долго весь процесс то происходит?
                                                                    • 0
                                                                      ну, если расскоментить еще три строчки в основном скрипте, можно увидеть сгенерированный html, весом 5-10 мб :), который появляется после прохождения строчек в консоли, на основе чего создается pdf, а дальше файлик грубо говоря отдается pisa, где я уже, к сожалению, не могу повлиять на время ее работы, поэтому и советую разбивать по датам
                                                                • –16
                                                                  Ух ты! ты изобрел эверноут
                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                    • +2
                                                                      Если честно, я бы вас пивом угостил за такой полезный скрипт )
                                                                      Будите в Киеве, пишите ;)
                                                                      Спасибо!
                                                                      • 0
                                                                        Спасибо)) Эх, ну теперь если только в командировку туда отправят(
                                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                                        • 0
                                                                          Индекс строится на основе тегов — , поэтому их логика не всегда может соответствовать действительности.
                                                                          • 0
                                                                            Извиняюсь, на основе тегов <h1> — <h6>
                                                                        • 0
                                                                          Я еще не добрался до компьютера, но хотел бы заранее спросить: можно ли настраивать формат бумаги? Я бы хотел подогнать под экран киндла
                                                                          • 0
                                                                            Можно, достаточно прописать в скрипте pdf_gen.py строчку
                                                                            • 0
                                                                              например

                                                                              @page {
                                                                              size: a5 landscape;
                                                                              }
                                                                            • +2
                                                                              До этого момента с Питоном знаком не был, но уж очень захотелось заиметь PDF версию избранного.
                                                                              Итак, небольшая инструкция по использованию данного скрипта под Windows:

                                                                              1. Ставим Python 2.7.1 x86 (под версией 3.0 и выше скрипт не работает, под x64 проблемы с _imaging)
                                                                              2. Ставим pisa 3.0.31 и необходимые для неё модули:
                                                                              Часть модулей устанавливается через Windows Installer,
                                                                              часть командой C:\python27\python.exe setup.py install
                                                                              ReportLab Toolkit 2.5, html5lib 0.9, PyPdf 1.13, PIL 1.1.7, setuptools 0.6c11, pisa 3.0.33.
                                                                              3. Патчим C:\Python27\Lib\site-packages\PIL\Image.py согласно комментарию.
                                                                              4. Редактируем fav2pdf.py по инструкции в посте.
                                                                              5. C:\Python27\python.exe fav2pdf.py
                                                                              6. PROFIT и спасибо Автору.

                                                                              P.S. По окончанию работы скрипт всётаки выдал ошибку в pisa_document.py", line 229, in pisaDocument
                                                                              Тем не менее PDF файл успешно создался и содержит все статьи из избранного.
                                                                              • 0
                                                                                Ого, спасибо за ман! Добавил в пост)
                                                                              • 0
                                                                                у меня при завершении появилась ошибка и файл pdf не открывается:




                                                                                Processed page 18 of 18:
                                                                                — 161 Topic: Веб-дизайн->Как сделать favicon в png
                                                                                162 Topic: Web-разработка->10 рекомендаций по html-верстке электронных писем
                                                                                163 Topic: Управление проектами->Концепт маленькой веб-студии в суровых сибирских условиях
                                                                                — Prepare PDF…

                                                                                No handlers could be found for logger «ho.pisa»
                                                                                • 0
                                                                                  А работа скрипта завершилась? Судя по количеству избранного, файлик еще генерится…
                                                                                  • 0
                                                                                    Действительно работа не завершилась, но после завершения вылезла ошибка о котороы вы описали в дополнении, подскажите как поставить патч?

                                                                                    Ещё избранного получилось 163 из 174 но я понимаю это из за закрытых топиков.
                                                                                    • 0
                                                                                      вот так всё закончилось, файл пустой…

                                                                                      Prepare PDF…

                                                                                      No handlers could be found for logger «ho.pisa»
                                                                                      Traceback (most recent call last):
                                                                                      File «fav2pdf.py», line 101, in
                                                                                      go(content, user+'.pdf')
                                                                                      File "/home/art/Downloads/vrtx64-fav2pdf-ca895ea/pdf_gen.py", line 171, in go
                                                                                      pisa.CreatePDF(content, file(filename, 'wb'))
                                                                                      File "/usr/lib/pymodules/python2.6/sx/pisa3/pisa_document.py", line 161, in pisaDocument
                                                                                      doc.build(c.story)
                                                                                      File "/usr/lib/python2.6/dist-packages/reportlab/platypus/doctemplate.py", line 877, in build
                                                                                      self.handle_flowable(flowables)
                                                                                      File "/usr/lib/python2.6/dist-packages/reportlab/platypus/doctemplate.py", line 793, in handle_flowable
                                                                                      raise LayoutError(ident)
                                                                                      reportlab.platypus.doctemplate.LayoutError: Flowable Хотелось бы сразу предупредить(520.275590551 x 1473.7205) too large on page 489 in frame 'body'(520.275590551 x 759.38976378*) of template 'body'
                                                                                      • 0
                                                                                        Да, в курсе этой проблемы, еще у одного человека такая же ошибка. Причина известна (размер изображения в каком-то топике шире листа а4), сегодня попробую вылечить. Как будет готово, дам знать. Спасибо!
                                                                                        • 0
                                                                                          Исправил багу в коммите
                                                                                  • +1
                                                                                    > Совсем не силен в регулярках, если кто-то подскажет более оптимальные выражения, буду благодарен.
                                                                                    Используйте pyQuery — порт jQuery в Python.

                                                                                    Все-таки разбирать селекторами DOM-дерево намного правильнее и проще, чем регулярками.
                                                                                    • +1
                                                                                      Во, походу то что надо, спасибо!
                                                                                    • 0
                                                                                      А нельзя ли сделать модификацию для перегонки не избранного, а отдельного блога в PDF? Можно считать это фич-реквестом.
                                                                                      • 0
                                                                                        Это уже есть :)
                                                                                        Статья на хабре — habrahabr.ru/blogs/startup/84545/
                                                                                        Сам проект — habrahabr.arrlab.ru
                                                                                        • 0
                                                                                          Там я уже был — он даёт возможность только за конкретный месяц выгрести статьи из блога, а мне хотелось бы весь архив блога иметь.
                                                                                          • 0
                                                                                            Кроме того, даже выборку за месяц мне не удалось сделать — ошибка граблей.
                                                                                            • 0
                                                                                              Хм, да, тоже увидел проблему… Впринципе это не сложно будет сделать, попробую на выходных
                                                                                        • 0
                                                                                          xarakternuk@kpuxitka:~/Завантаження/vrtx64-fav2pdf-48a9636$ python fav2pdf.py
                                                                                          /usr/lib/pymodules/python2.6/pyPdf/pdf.py:52: DeprecationWarning: the sets module is deprecated
                                                                                          from sets import ImmutableSet

                                                                                          Processed page 1 of 11:
                                                                                          — — Processed page 2 of 11:
                                                                                          — — Processed page 3 of 11:
                                                                                          — — Processed page 4 of 11:
                                                                                          — — Processed page 5 of 11:
                                                                                          — — Processed page 6 of 11:
                                                                                          — — Processed page 7 of 11:
                                                                                          — — Processed page 8 of 11:
                                                                                          — — Processed page 9 of 11:
                                                                                          — — Processed page 10 of 11:
                                                                                          — — Processed page 11 of 11:
                                                                                          — — Prepare PDF…

                                                                                          Создается пдф — первая страница и все. Есть идеи?
                                                                                          • 0
                                                                                            Да, в курсе проблемы. Чуток освобожусь — поправлю.
                                                                                            • 0
                                                                                              Отлично.
                                                                                              Ждус…
                                                                                              Может заодно и закрытые блоги все-таки подключить получится?
                                                                                              • 0
                                                                                                Сделать-то не проблема, но для этого придется вводить логин\пароль в настройках скрипта… иначе никак. Просто раньше из-за капчи это было сделать несколько проблематично.
                                                                                                • 0
                                                                                                  Капчи нет — а вводить логин и так приходится.
                                                                                                  Если раньше закрытыми были только уникальные блоги — то теперь, с введением ппа — половина Хабра. + еще некоторые удоты в черновики посмертно засвеченные топики попереносили.

                                                                                              • 0
                                                                                                Такая же проблема =\
                                                                                                Раньше (в январе) работал, а сейчас перестал.
                                                                                                Может это из-за того, что хабр как то изменился за это время.
                                                                                                • 0
                                                                                                  Добрался до скрипта) замените в файле fav2pdf.py строчку
                                                                                                  res = re.findall('class="blog">(.*)<\/a> &rarr\s*\D*\s+<a \D*href="(.*)"\D* class="topic">(.*)<\/a>', dr)
                                                                                                  на
                                                                                                  res = re.findall('class="blog">(.*)<\/a>\D*\s*→\s*\D*\s+<a \D*href="(.*)"\D* class="topic">(.*)<\/a>', dr)
                                                                                                  сегодня закоммичу изменение на гитхабе
                                                                                                  • 0
                                                                                                    урррааа!
                                                                                                    ждём, ждём! :)
                                                                                            • 0
                                                                                              Если все еще актуально :) замените в файле fav2pdf.py строчку
                                                                                              res = re.findall('class="blog">(.*)<\/a> &rarr\s*\D*\s+<a \D*href="(.*)"\D* class="topic">(.*)<\/a>', dr)
                                                                                              на
                                                                                              res = re.findall('class="blog">(.*)<\/a>\D*\s*→\s*\D*\s+<a \D*href="(.*)"\D* class="topic">(.*)<\/a>', dr)
                                                                                              сегодня закоммичу изменение на гитхабе
                                                                                              • 0
                                                                                                Актуально!
                                                                                                Проверить смогу только после вторника.
                                                                                                Обязательно отпишусь.
                                                                                            • 0
                                                                                              Processed page 14 of 14:
                                                                                              — 130 Topic: GTD->Перевод статьи «Work 2.0 – the interruptible programmer»
                                                                                              131 Topic: GTD->Программист, который отвлекается
                                                                                              132 Topic: Системное администрирование->Перехват и редактирование файлов http-трафика на примере торрента
                                                                                              133 Topic: iPhone->Jailbreak iPhone 3GS, iPod Touch 3G, iPad, iPhone 4, iPod Touch 4G. Geohot опять всех сделал…
                                                                                              — Prepare PDF…

                                                                                              No handlers could be found for logger «ho.pisa»
                                                                                              Traceback (most recent call last):
                                                                                              File «fav2pdf.py», line 109, in
                                                                                              go(content, user+'.pdf')
                                                                                              File "/home/xarakternuk/Завантаження/vrtx64-fav2pdf-9d1e6a7/pdf_gen.py", line 170, in go
                                                                                              pisa.CreatePDF(content, file(filename, 'wb'))
                                                                                              File "/usr/lib/pymodules/python2.6/sx/pisa3/pisa_document.py", line 161, in pisaDocument
                                                                                              doc.build(c.story)
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/platypus/doctemplate.py", line 877, in build
                                                                                              self.handle_flowable(flowables)
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/platypus/doctemplate.py", line 776, in handle_flowable
                                                                                              if frame.add(S[0], canv, trySplit=0):
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/platypus/frames.py", line 174, in _add
                                                                                              flowable.drawOn(canv, self._x + self._leftExtraIndent, y, _sW=aW-w)
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/platypus/flowables.py", line 106, in drawOn
                                                                                              self._drawOn(canvas)
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/platypus/flowables.py", line 87, in _drawOn
                                                                                              self.draw()#this is the bit you overload
                                                                                              File "/usr/lib/pymodules/python2.6/sx/pisa3/pisa_reportlab.py", line 564, in draw
                                                                                              Paragraph.draw(self)
                                                                                              File "/usr/lib/pymodules/python2.6/sx/pisa3/reportlab_paragraph.py", line 1054, in draw
                                                                                              self.drawPara(self.debug)
                                                                                              File "/usr/lib/pymodules/python2.6/sx/pisa3/reportlab_paragraph.py", line 1540, in drawPara
                                                                                              dpl( tx, _offsets[i], f, noJustifyLast and i==lim)
                                                                                              File "/usr/lib/pymodules/python2.6/sx/pisa3/reportlab_paragraph.py", line 337, in _leftDrawParaLineX
                                                                                              _putFragLine(offset, tx, line)
                                                                                              File "/usr/lib/pymodules/python2.6/sx/pisa3/reportlab_paragraph.py", line 217, in _putFragLine
                                                                                              tx._canvas.drawImage(cbDefn.image.getImage(),cur_x_s,cur_y+iy0,w,h,mask='auto')
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/pdfgen/canvas.py", line 825, in drawImage
                                                                                              imgObj = pdfdoc.PDFImageXObject(name, image, mask=mask)
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/pdfbase/pdfdoc.py", line 2072, in __init__
                                                                                              self.loadImageFromSRC(source) #it is already a PIL Image
                                                                                              File "/usr/lib/python2.6/dist-packages/reportlab/pdfbase/pdfdoc.py", line 2140, in loadImageFromSRC
                                                                                              raw = im.getRGBData()
                                                                                              File "/usr/lib/pymodules/python2.6/sx/pisa3/pisa_reportlab.py", line 313, in getRGBData
                                                                                              self._dataA = PmlImageReader(im.split()[3])
                                                                                              File "/usr/lib/python2.6/dist-packages/PIL/Image.py", line 1497, in split
                                                                                              if self.im.bands == 1:
                                                                                              AttributeError: 'NoneType' object has no attribute 'bands'
                                                                                              • 0
                                                                                                Упс, не туда ответил :)
                                                                                                В ps к топику указано решение данной проблемы
                                                                                                • 0
                                                                                                  В пс же немного не та.
                                                                                                  у меня как раз вот — habrahabr.ru/blogs/python/111411/#comment_3555013
                                                                                                  • 0
                                                                                                    Странно, тот косяк был исправлен, да и вывод совсем другой и заканчивается на AttributeError: 'NoneType' object has no attribute 'bands'. Патч точно применяли?
                                                                                              • 0
                                                                                                В ps к топику указано решение данной проблемы
                                                                                                • 0
                                                                                                  я программист, я не хочу ничего патчить. я хочу минет питон
                                                                                                  • 0
                                                                                                    ERROR [ho.pisa] /usr/local/lib/python2.7/dist-packages/sx/pisa3/pisa_parser.py line 131: Tag handling u'<br/>' Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/sx/pisa3/pisa_parser.py", line 119, in pisaGetAttributes nv = c.getFile(nv) File "/usr/local/lib/python2.7/dist-packages/sx/pisa3/pisa_context.py", line 938, in getFile return getFile(name, relative or self.pathDirectory) File "/usr/local/lib/python2.7/dist-packages/sx/pisa3/pisa_util.py", line 580, in getFile file = pisaFileObject(*a, **kw) File "/usr/local/lib/python2.7/dist-packages/sx/pisa3/pisa_util.py", line 508, in __init__ r1 = conn.getresponse() File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse response.begin() File "/usr/lib/python2.7/httplib.py", line 407, in begin version, status, reason = self._read_status() File "/usr/lib/python2.7/httplib.py", line 371, in _read_status raise BadStatusLine(line) BadStatusLine: '' WARNING [ho.pisa] /usr/local/lib/python2.7/dist-packages/sx/pisa3/pisa_tags.py line 364: Need a valid file name! u'<img src="http://dl.dropbox.com/u/1265062/misc/habr/rle_byte.png"/>'
                                                                                                    • 0
                                                                                                      Автор, будьте так любезны, переделайте скрипт под новую систему авторизации. Заранее спасибо.
                                                                                                      • 0
                                                                                                        Так тут авторизации не было никогда. Я скриптом, к сожалению, давно уже не занимался, однако на гитхабе есть разработчик, который дорабатывал мой скрипт под последние изменения. Попробуйте воспользоваться его скриптом github.com/JazzCore/fav2pdf
                                                                                                      • +1
                                                                                                        Немного доработал ваш скрипт.
                                                                                                        gist.github.com/icoz/8360969
                                                                                                        Изменения:
                                                                                                        1) содается папка pdf с подпапками posts и hubs
                                                                                                        2) при парсинге страницы выдираются и комментарии, потом они сохраняются в топике
                                                                                                        3) в posts сохраняются посты по имени id.pdf
                                                                                                        4) в hubs создаются подпапки с названиями хабов, которые упоминаются в топиках
                                                                                                        5) в тех подпапках хабов создаются символические ссылки на posts/id.pdf

                                                                                                        Спасибо за проделанную вами работу. Это сэкономило мне много времени.
                                                                                                        • 0
                                                                                                          Круто! :) Спасибо за отзыв и спасибо за действительно полезные доработки! Рад, что скриптик пригодился, думал, что им уже никто не пользуется :)
                                                                                                          • 0
                                                                                                            На самом деле просто на коленке допилил, чтобы работало как мне надо.
                                                                                                            А по-хорошему надо переписать на третьем питоне, сделать параметры командной строки (имя юзера, с какой по какую страницу, сохранять или нет комментарии), авторизацию…
                                                                                                            Кстати, где бы узнать какой api у mHabr?
                                                                                                            • 0
                                                                                                              Насколько я помню, api как такового доступно никогда не было, поэтому пришлось парсить страницы. Максимум, что я тогда нашел, вот этот бесполезный кусок.
                                                                                                              • +1
                                                                                                                Чуть посильнее переколбасил код.
                                                                                                                Добавил работу с командной строкой, провел рефакторинг.

                                                                                                                Для всех желающих: github.com/icoz/fav2pdf

                                                                                                                vrtx вам на github'е направил pull-request

                                                                                                                Вот опции, что теперь поддерживаются:
                                                                                                                usage: fav2pdf.py [-h] [-d OUTPUT_DIR] [--from-date FROM_DATE]
                                                                                                                                  [--to-date TO_DATE] [--all-in-one]
                                                                                                                                  [--only-hubs [ONLY_HUBS [ONLY_HUBS ...]]] [--no-comments]
                                                                                                                                  [--no-symlinks]
                                                                                                                                  user
                                                                                                                
                                                                                                                Tool for save favorite posts from habrahabr.ru in pdfs
                                                                                                                
                                                                                                                positional arguments:
                                                                                                                  user                  habrahabr.ru username
                                                                                                                
                                                                                                                optional arguments:
                                                                                                                  -h, --help            show this help message and exit
                                                                                                                  -d OUTPUT_DIR, --output-dir OUTPUT_DIR
                                                                                                                                        Directory for output
                                                                                                                  --from-date FROM_DATE
                                                                                                                                        From date
                                                                                                                  --to-date TO_DATE     To date
                                                                                                                  --all-in-one          Save all posts in one PDF-file
                                                                                                                  --only-hubs [ONLY_HUBS [ONLY_HUBS ...]]
                                                                                                                                        Save only posts from hubs. For multiple: "--only-hubs
                                                                                                                                        Hub1 Hub2 --"
                                                                                                                  --no-comments         Dont save comments from posts
                                                                                                                  --no-symlinks         Dont create symlinks to posts
                                                                                                                
                                                                                                                • 0
                                                                                                                  Спасибо за проделанную работу, мега удобная утилита получилась! Заслуживает отдельного поста ;)
                                                                                                                  • 0
                                                                                                                    Думаю над этим, может сегодня напишу.

                                                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.