Пользователь
0,0
рейтинг
7 января 2011 в 19:57

Разработка → Избранное Хабра в 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 <[email protected]>
# 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
Совсем не силен в регулярках, если кто-то подскажет более оптимальные выражения, буду благодарен.
vrtx64 @vrtx
карма
88,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (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
        во программисты пошли… Уже патчить разучились…
  • +3
    • +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> →\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
              Готово!
    • 0
      Если все еще актуально :) замените в файле fav2pdf.py строчку
      res = re.findall('class="blog">(.*)<\/a> →\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
                Думаю над этим, может сегодня напишу.

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