Ненавижу длинные вступления
И поэтому не буду писать их даже под спойлером.
- Что?
- Сабж.
- Зачем?
- Читать в оффлайне на электронных книгах.
- Моя книга не поддерживает FB2!
- Хочу!
- Обзаводимся Python 2.6+. Тестировалось на Python 2.7.3.
- Ставим библиотеку BeautifulSoup 4. Вкратце варианты:
apt-get install python-beautifulsoup4
easy_install beautifulsoup4
pip install beautifulsoup4
- Исходники и
python setup.py install
- Качаем код из репозитория. (прямая ссылка на последнюю версию на момент написания)
- Открываем файл
habrafav.py
и в строкеusername = ...
прописываем свой логин. python habrafav.py
(или простоhabrafav.py
под Windows)- Ждём. У меня с кэшированными данными экспорт ~150 статей занимает около 6 минут и 600 Мб оперативной памяти.
- Забираем
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, но, возможно, ошибка где-то у меня.
- Есть странный баг с исчезанием пробелов вокруг тегов, находящихся внутри текста. То есть HTML-код
- Что-нибудь интересное в реализации?
- Не особо. Весь парсинг сводится к правильным библиотечным вызовам. После него я выкачиваю все картинки и заменяю теги
<img src=image_url/>
на<image l:href="#image_id"/>
. Затем при помощи небольшого набора костылей перестраиваю деревья разбора. Удаляю одни теги, заменяю другие, вставляю третьи. Наконец, собираю всё это вместе, добавляю шапку, подвал и пишу в файл. Единственный не совсем тривиальный момент — замена тегов на<p>
. Грубо говоря — вместо разделителей между параграфами я выделяю сами параграфы. Кому интересно — файлconversion.py
, функцияmake_paragraphs
.
- Не особо. Весь парсинг сводится к правильным библиотечным вызовам. После него я выкачиваю все картинки и заменяю теги
- Да этому же прямая дорога на govnokod.ru!
- Вполне возможно. Я только изучаю возможности BeautifulSoup, поэтому наверняка какие-то вещи сделал не так, как это принято. Напишите в комментариях вашу точку зрения, обсудим.
- Я нашёл ещё баг!
- BitBucket поддерживает форки.
Автор: Pastafarianist