@Ivan2121

PythonGrab — Как извлечь отдельные части текста и заменить html-теги на свои?

Дано, пишу парсер на grab:

Текст в html-коде страницы:

<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=”&gt;&#58;&#40;“ title=”Angry“ class=”smiley“ /><br />&nbsp;И нужно ли, главное? <img src=”http://www.astronomy.ru/forum/Smileys/kolobok/smiley.gif“ alt=”&#58;&#41;“ title=”Smiley“ class=”smiley“ /><br /></blockquote><div class=”quotefooter“><div class=”botslice_quote“></div></div>Не нужно.</div>


1. Нужно извлечь отдельно
<blockquote class=”bbc_standard_quote“>Сразу скажу-в микроконтроллерах не силен <img src=”http://www.forum.ru/forum/Smileys/kolobok/angry.gif“ alt=”&gt;&#58;&#40;“ title=”Angry“ class=”smiley“ /><br />&nbsp;И нужно ли, главное? <img src=”http://www.forum.ru/forum/Smileys/kolobok/smiley.gif“ alt=”&#58;&#41;“ title=”Smiley“ class=”smiley“ /><br /></blockquote>


2. И отдельно извлечь: </div>Не нужно.</div>

3. Лишний код удалить и произвести замену кода в извлеченных частях:
<blockquote class=”bbc_standard_quote“> на [quote]
</blockquote> на [/quote]
<img src=” на [img]
“ alt=” на [/img]


4. В итоге должно получится так:
[quote]Сразу скажу-в микроконтроллерах не силен
[img]http://www.forum.ru/forum/Smileys/kolobok/angry.gi... нужно ли, главное? [img]http://www.forum.ru/forum/Smileys/kolobok/smiley.g...
Не нужно.

Подскажите пожалуйста, как это сделать грамотно, потому что у меня пока получается только так:

“Сразу скажу-в микроконтроллерах не силенИ нужно ли, главное?”

Тобишь голый текст получается без вставки/замены своего текста(тегов).
  • Вопрос задан
  • 550 просмотров
Пригласить эксперта
Ответы на вопрос 1
@egorsmkv
Грамонто парсинг трудно делать, а особенно преобразование текста. Лучшим способом решить вашу задачу является перевести HTML-код в древовидный список и заменить img ихними url'ами. Но инструмента для этого я не нашел.

Поэтому сделать поел другим путем:
  1. получил данные из blockquote;
  2. перевел полученный html-код в markdown;
  3. и заменил ссылки на изображения в бб-код;

Для этого нужно две библиотеки: 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="&gt;&#58;&#40;" title="Angry" class="smiley" /><br />&nbsp;И нужно ли, главное? <img src="http://www.astronomy.ru/forum/Smileys/kolobok/smiley.gif" alt="&#58;&#41;" 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)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы