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

в 22:02, , рубрики: beautiful soup, fb2, python, избранное, хабрахабр, экспорт, электронные книги, метки: , , , , ,
Ненавижу длинные вступления
И поэтому не буду писать их даже под спойлером.

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

  • Уже было.
    • Знаю. Только
      • PDF нормально отображается не везде;
      • У меня так и не получилось запустить тот код.
  • А комментарии есть?
    • Нет. Есть парсинг, но нет экспорта. Прикрутить несложно, но тогда получаемый файл раздуется ещё раза в два-три.
  • Почему FB2?
  • Преобразование корректное?
    • Не совсем. Валидацию получающиеся файлы не проходят.
    • Результаты валидации моего избранного
      • 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!
    • Вполне возможно. Я только изучаю возможности BeautifulSoup, поэтому наверняка какие-то вещи сделал не так, как это принято. Напишите в комментариях вашу точку зрения, обсудим.
  • Я нашёл ещё баг!

Автор: Pastafarianist

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js