Грамонто парсинг трудно делать, а особенно преобразование текста. Лучшим способом решить вашу задачу является перевести HTML-код в древовидный список и заменить img ихними url'ами. Но инструмента для этого я не нашел.
Поэтому сделать поел другим путем:
- получил данные из blockquote;
- перевел полученный html-код в markdown;
- и заменил ссылки на изображения в бб-код;
Для этого нужно две библиотеки:
selection и
html2text (обе ставятся из PyPI).
Собственно, решение такое:
from selection import XpathSelector
from lxml.html import fromstring
import re
import html2text
if __name__ == '__main__':
html_code = '<div class="inner" id="msg_3218830"><div class="quoteheader"><div class="topslice_quote"><a href="http://www.forum.ru/forum/index.php/topic,129548.msg3218815.html#msg3218815">Цитата: Nikitos_B от <strong>Сегодня</strong> в 01:04:06</a></div></div><blockquote class="bbc_standard_quote">Сразу скажу-в микроконтроллерах не силен <img src="http://www.forum/forum/Smileys/kolobok/angry.gif" alt=">:(" title="Angry" class="smiley" /><br /> И нужно ли, главное? <img src="http://www.astronomy.ru/forum/Smileys/kolobok/smiley.gif" alt=":)" title="Smiley" class="smiley" /><br /></blockquote><div class="quotefooter"><div class="botslice_quote"></div></div>Не нужно.</div>'
sel = sel = XpathSelector(fromstring(html_code))
quote = sel.select('//blockquote')
quote_html = quote.html()
quote_html = quote_html.replace('<blockquote class="bbc_standard_quote">', '[quote]')
quote_html = quote_html.replace('</blockquote>', '[/quote]')
quote_html = re.sub('!\[(.*)\]\((.*)\)', lambda m: '[img]' + m.group(2) + '[/img]',
html2text.html2text(quote_html))
end_text = re.sub('(.*)<\/div>(.*)<\/div>', lambda m: m.group(2), html_code)
final_text = quote_html.strip() + '\n' + end_text
print(final_text)