- PVSM.RU - https://www.pvsm.ru -

Экспорт избранного Хабра в FB2

Ненавижу длинные вступления

И поэтому не буду писать их даже под спойлером.

  • Что?
    • Сабж.
  • Зачем?
    • Читать в оффлайне на электронных книгах.
  • Моя книга не поддерживает FB2!
  • Хочу!
    1. Обзаводимся Python 2.6+ [2]. Тестировалось на Python 2.7.3 [3].
    2. Ставим [4] библиотеку BeautifulSoup 4. Вкратце варианты:
      • apt-get install python-beautifulsoup4
      • easy_install beautifulsoup4
      • pip install beautifulsoup4
      • Исходники [5] и python setup.py install
    3. Качаем код из репозитория [6]. (прямая ссылка [7] на последнюю версию на момент написания)
    4. Открываем файл habrafav.py и в строке username = ... прописываем свой логин.
    5. python habrafav.py (или просто habrafav.py под Windows)
    6. Ждём. У меня с кэшированными данными экспорт ~150 статей занимает около 6 минут и 600 Мб оперативной памяти.
    7. Забираем habrahabr_favorites.fb2. Мой занимает примерно 62 Мб.

  • Уже было [8].
    • Знаю. Только
      • PDF нормально отображается не везде;
      • У меня так и не получилось запустить тот код.
  • А комментарии есть?
    • Нет. Есть парсинг, но нет экспорта. Прикрутить несложно, но тогда получаемый файл раздуется ещё раза в два-три.
  • Почему FB2?
  • Преобразование корректное?
    • Не совсем. Валидацию [11] получающиеся файлы не проходят.
    • Результаты валидации моего избранного

      • This element is not expected.
        • <empty-line> — 287 раз
        • <code> — 83 раза
        • <emphasis> — 19 раз
        • <strong> — 7 раз
        • <subtitle> — 5 раз
        • <cite> — 4 раза
        • <a> — 3 раза
        • <image> — 2 раза
        • <sup> — 1 раз
      • Character content other than whitespace is not allowed because the content type is 'element-only'. Тег — <cite>, 245 раз.
      • empty tag. Тег — <td>, 19 раз.
    • Тем не менее, мой Kindle получившийся файл (после конвертации в .mobi) прекрасно отображает.
  • А с неформальной точки зрения?
    • Есть странный баг с исчезанием пробелов вокруг тегов, находящихся внутри текста. То есть HTML-код yet <b>another</b> bicycle превращается в yet<strong>another</strong>bicycle. Вероятно, это баг BeautifulSoup, но, возможно, ошибка где-то у меня.
  • Что-нибудь интересное в реализации?
    • Не особо. Весь парсинг сводится к правильным библиотечным вызовам. После него я выкачиваю все картинки и заменяю теги <img src=image_url/> на <image l:href="#image_id"/>. Затем при помощи небольшого набора костылей перестраиваю деревья разбора. Удаляю одни теги, заменяю другие, вставляю третьи. Наконец, собираю всё это вместе, добавляю шапку, подвал и пишу в файл. Единственный не совсем тривиальный момент — замена тегов на <p>. Грубо говоря — вместо разделителей между параграфами я выделяю сами параграфы. Кому интересно — файл conversion.py, функция make_paragraphs.
  • Да этому же прямая дорога на govnokod.ru [12]!
    • Вполне возможно. Я только изучаю возможности BeautifulSoup, поэтому наверняка какие-то вещи сделал не так, как это принято. Напишите в комментариях вашу точку зрения, обсудим.
  • Я нашёл ещё баг!
    • BitBucket поддерживает форки [13].

Автор: Pastafarianist


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/10507

Ссылки в тексте:

[1] Универсальный конвертор: http://calibre-ebook.com/

[2] Python 2.6+: http://www.python.org/download/

[3] Python 2.7.3: http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi

[4] Ставим: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup

[5] Исходники: http://www.crummy.com/software/BeautifulSoup/bs4/download/4.0/

[6] репозитория: https://bitbucket.org/Pastafarianist/habrafav/overview

[7] прямая ссылка: https://bitbucket.org/Pastafarianist/habrafav/get/ecf26c772051.zip

[8] было: http://habrahabr.ru/post/111411/

[9] Описание: http://www.fictionbook.org/index.php/%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B0_FB2_%D0%BE%D1%82_Sclex

[10] схема: http://www.fictionbook.org/index.php/XML_%D1%81%D1%85%D0%B5%D0%BC%D0%B0_FictionBook2.1

[11] Валидацию: https://code.google.com/p/fb2utils/

[12] govnokod.ru: http://govnokod.ru/

[13] форки: https://bitbucket.org/Pastafarianist/habrafav/fork