У меня есть 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 ).