Окружить последовательность братьев и сестер в новом теге - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть HTML документ, который выглядит следующим образом:

import bs4 as bs
content = '''\
<p class="foo">Introductory text</p>
  <p class="bar">quoted material p1</p>
  <p class="bar">quoted material p2</p>
<p class="foo">discussion of quoted material</p>
<p class="foo">more text</p>
  <p class="bar">short quote</p>
<p class="foo">discussion of quoted material</p>'''
soup = bs.BeautifulSoup(content)

Я хотел бы окружить элементы <p>, класс которых bar, в тегах blockquote. Однако, когда несколько <p class="bar"> появляются в последовательности, я бы хотел, чтобы они рассматривались как одна цитата. Желаемый результат:

<p class="foo">Introductory text</p>
<blockquote>
  <p class="bar">quoted material p1</p>
  <p class="bar">quoted material p2</p>
</blockquote>
<p class="foo">discussion of quoted material</p>
<p class="foo">more text</p>
<blockquote>
  <p class="bar">short quote</p>
</blockquote>
<p class="foo">discussion of quoted material</p>

Следующее решение неприемлемо:

for bar in soup.find_all('p', {'class': 'bar'}):
    bar.wrap(soup.new_tag('blockquote'))

дает

<html><body><p class="foo">Introductory text</p>
<blockquote><p class="bar">quoted material p1</p></blockquote>
<blockquote><p class="bar">quoted material p2</p></blockquote>
<p class="foo">discussion of quoted material</p>
<p class="foo">more text</p>
<blockquote><p class="bar">short quote</p></blockquote>
<p class="foo">discussion of quoted material</p></body></html>

Одна из идей заключается в использовании .find_next(), insert_before() и методы insert_after(), но я не могу заставить bs4 вставлять каждую «половину» тега blockquote отдельно ( related ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...