Pull to refresh

Comments 113

UFO just landed and posted this here
Спасибо! Статья очень полезна.
Вы меня направили на путь, сделать такое же только на C++.
Не надо. CHM, как бы так сказать, немного мёртвый формат, и полностью ненужен при наличии PDF. Делайте в PDF.
Хорошо! Завтра поеду за видяхой, а в понедельник буду искать некоторую инфу и начинать собирать проект.
Посмотрите в сторону Qt. В наличии:
— WebKit в качестве рендера
— PDF принтер в комплекте
— поддержка БД, можно сразу делать каталог
сделайте fb2, владельцам электронных читалок на радость
И epub для stanz'ы?:) А лучше поработать с evernote api и нужные статьи перенести туда, благо клиенты под любую ось есть.

На самом деле, избранное так захламлено, как и любые другие закладки, нужна кнопочка почистить всё избранное, а то там с 2007 столько накопилось и уже не актуального, но это уже в адрес хабрАдминам.
Было бы интересно посмотреть)
А материалы не принадлежат хабрахабру или авторам? Придётся договариваться.
Прошу прощения, посмотрел соглашение, видимо все статьи принадлежат авторам. Придётся договариваться лично с каждым :)
Ну это ж для личного пользования, не?
Ну либо попросить всех поставить CC плашку.
Счас как начнется хабраэффект хабру…
Кстати, было бы неплохо если бы выпускался ежемесячный журнал с лучшими постами хабра. Яб даже подписался на такое ) Жаль, минусовать в журнале не получится ))))
Отличная идея для сервиса:
Выбираете частоту генерации журнала, выбираете любимый формат, вводите e-mail и готово!
Печатать QR-коды с id выпуска\статьи, переходы засчитывать как ± в карму ))
Хм.
На то статьи и лучшие, чтобы их не минусовать уже )
У меня точна такая же идея была…
В Украине есть такая газета «Компьютер». Так вот в последняя время им нету чего писать. Если бы они печатали по 10 топиков, я бы покупал их чаще ;)
был же хабрадайжест. разве не то?
Не пользуйтесь дропбоксом в качестве хостинга картинок для хабра, забанят же за количество запросов.
Я так всегда делал, даже картинка из новогоднего поздравления, которое висело на главной и было много раз прочитано, и та хостилась на дропбоксе. Или у вас есть личный негативный опыт?
Спасибо, интересный топик.
Насколько я из него понял, если не использовать дропбокс в коммерческих целях (например, используя его API сделать файлхостинг платный или прикрутить его к сайту, с целью отдачи через дропбокс файлов пользователям), то все нормально будет.
По крайней мере, меня до сих пор не забанили, а я в своих примерно 10-15 топиках точно использовал дропбокс.
А вот некий сервис пикуча.ру, который мне раньше нравился, спустя примерно полтора года, ничтоже сумняшеся удалил все мои картинки со своего сайта. :(
дровбокс живёт на амазоне в облаке,
на амазоне есть плата за запросы.
большое количество запросов не выгодно создателям дропбокса.
Помнится была статистическая статья на Хабре. Ссылку дать не могу, не получается ее найти.
Согласно ей, дропбокс с самого интересного топика на Хабре с картинкой потеряет не более 20-30 центов, а то и меньше.
Ну а количество настолько интересных топиков не так уж и велико. :)
И не только за запросы, но и за трафик, 15 центов за гиг, кажется.
Да вроде с предыдущим топиком продержался, зато изображения по истечении времени не удаляются. И согласен с комментом ниже, интересует негативный опыт использования, не хотелось бы быть там забаненым…
О_о, в хабре есть избранное! Нужно почаще заходить в свой профиль)
Автора топика в pdf-ах тоже можно сделать ссылочкой на его хабрацентр
да можно, постараюсь на выходных еще пару мыслей доделать. А еще лучше складывайте их на гитхабе, по мере появления времени буду делать.
Спасибо за наводку на python-pisa, давно думал чем бы заменить перловый html2ps, но все руки не доходили поискать.
Что-то у него с кирилическими шрифтами не того :( Ладно, будет время разберемся.
Да, есть такое) нужно цеплять в цсске отдельно шрифты. Да и в целом в писе ограничений немало, хотя если нет охоты возиться с самим ReportLab то и это пойдет
ReportLab я тоже забукмаркал :) Наша система сама эти документы генерирует, так-что промежуточное звено (HTML) вполне можна выкинуть.
У меня была идея что-то типа HabraMag я также верстать собрался уже… а потом подумал, народ может негативно отнестись, да и Администрация не знаю как ответит на это… да и нужно мне еще 1-2 человека, для подготовки контента.
Если бы я уверен что прокатит, я бы уже наконец дорисовал набросок журнала)))
Объясните как воспользоваться фиксом.
Черт, отправилось. Правлю файл /usr/lib/python2.6/dist-packages/PIL/Image.py
Нахожу строчку с def split(self):

Как там что править? Может кто нибудь выложить уже исправленный этот блок?
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)
self.load() перенеси выше
во программисты пошли… Уже патчить разучились…
блин, напугали, думал скрипт так сверстал)
Был уже когда-то habradigest
пока набросок… но если были бы предложения то думаю можно было бы сверстать пару выпусков, а если было бы популярное, то выпускали бы постоянно…
Вообще журнал на основе статей с хабра это идея интересная, но думаю основная ее проблема в том, что так как хабр довольно разносторонний, сложно будет найти основную тему журнала
А что мешает просто помещать туда лучшие статьи?
Да собственно ничего, просто получится еще один habradigest и, боюсь, его постигнет та же участь(
Если будут заинтересованы люди, кто ж мешает, можно и писать статьи специально для журнала… + может статьи или уроки более обширные, развернутые.
В общем я предложил) Если что — пишите письма.
Вот бы сюда что то вроде создания книг от wiki прикрутить…
Обработал все посты, судя по логу, а потом выдал:
Prepare PDF…

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

@page {
size: a5 landscape;
}
До этого момента с Питоном знаком не был, но уж очень захотелось заиметь 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 файл успешно создался и содержит все статьи из избранного.
Ого, спасибо за ман! Добавил в пост)
у меня при завершении появилась ошибка и файл 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»
А работа скрипта завершилась? Судя по количеству избранного, файлик еще генерится…
Действительно работа не завершилась, но после завершения вылезла ошибка о котороы вы описали в дополнении, подскажите как поставить патч?

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

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'
Да, в курсе этой проблемы, еще у одного человека такая же ошибка. Причина известна (размер изображения в каком-то топике шире листа а4), сегодня попробую вылечить. Как будет готово, дам знать. Спасибо!
Исправил багу в коммите
> Совсем не силен в регулярках, если кто-то подскажет более оптимальные выражения, буду благодарен.
Используйте pyQuery — порт jQuery в Python.

Все-таки разбирать селекторами DOM-дерево намного правильнее и проще, чем регулярками.
Во, походу то что надо, спасибо!
А нельзя ли сделать модификацию для перегонки не избранного, а отдельного блога в PDF? Можно считать это фич-реквестом.
Там я уже был — он даёт возможность только за конкретный месяц выгрести статьи из блога, а мне хотелось бы весь архив блога иметь.
Кроме того, даже выборку за месяц мне не удалось сделать — ошибка граблей.
Хм, да, тоже увидел проблему… Впринципе это не сложно будет сделать, попробую на выходных
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…

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

Такая же проблема =\
Раньше (в январе) работал, а сейчас перестал.
Может это из-за того, что хабр как то изменился за это время.
Добрался до скрипта) замените в файле 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)
сегодня закоммичу изменение на гитхабе
урррааа!
ждём, ждём! :)
Если все еще актуально :) замените в файле 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)
сегодня закоммичу изменение на гитхабе
Актуально!
Проверить смогу только после вторника.
Обязательно отпишусь.
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'
Упс, не туда ответил :)
В ps к топику указано решение данной проблемы
Странно, тот косяк был исправлен, да и вывод совсем другой и заканчивается на AttributeError: 'NoneType' object has no attribute 'bands'. Патч точно применяли?
В ps к топику указано решение данной проблемы
я программист, я не хочу ничего патчить. я хочу минет питон
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"/>'
Автор, будьте так любезны, переделайте скрипт под новую систему авторизации. Заранее спасибо.
Так тут авторизации не было никогда. Я скриптом, к сожалению, давно уже не занимался, однако на гитхабе есть разработчик, который дорабатывал мой скрипт под последние изменения. Попробуйте воспользоваться его скриптом github.com/JazzCore/fav2pdf
Немного доработал ваш скрипт.
gist.github.com/icoz/8360969
Изменения:
1) содается папка pdf с подпапками posts и hubs
2) при парсинге страницы выдираются и комментарии, потом они сохраняются в топике
3) в posts сохраняются посты по имени id.pdf
4) в hubs создаются подпапки с названиями хабов, которые упоминаются в топиках
5) в тех подпапках хабов создаются символические ссылки на posts/id.pdf

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

Для всех желающих: 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
Спасибо за проделанную работу, мега удобная утилита получилась! Заслуживает отдельного поста ;)
Думаю над этим, может сегодня напишу.
Sign up to leave a comment.

Articles