How to move sub-tags to right after a mother tag in case there are more than 1 occurrence?

Viewed 69

I'm trying to move all sub-tags of each <div class="c-s"> to right before the its mother tag <div class="c-w">. For example,

from bs4 import BeautifulSoup

txt = '''
<div class="c-w">
  <div class="c-s">
    <div class="ex_example"> aa </div>
    <div class="ex_example"> aa </div>
  </div>
</div>

<div class="audio">link</div>

<div class="c-w">
  <div class="c-s">
    <div class="ex_example"> xx </div>
    <div class="ex_example"> yy </div>
  </div>
</div>
'''

soup = BeautifulSoup(txt, 'html.parser')

My expected output is the following BeautifulSoup object

<div class="ex_example"> aa </div>
<div class="ex_example"> aa </div>
<div class="ex_example"> cc </div>
<div class="c-w">
  <div class="c-s"></div>
</div>
<div class="ex_example"> xx </div>
<div class="ex_example"> yy </div>
<div class="ex_example"> zz </div>
<div class="c-w">
  <div class="c-s"></div>
</div>

This means the level of such <div class="ex_example"> cc </div> is the same as <div class="c-w">.

Thank you so much for your help!

1 Answers

This script will move all tags with class="ex_example" in front of parent <div class="c-w">:

from bs4 import BeautifulSoup

txt = '''
<div class="c-w">
  <div class="c-s">
    <div class="ex_example"> aa </div>
    <div class="ex_example"> aa </div>
    <div class="ex_example"> cc </div>
  </div>
</div>

<div class="audio">link</div>

<div class="c-w">
  <div class="c-s">
    <div class="ex_example"> xx </div>
    <div class="ex_example"> yy </div>
    <div class="ex_example"> zz </div>
  </div>
</div>
'''

soup = BeautifulSoup(txt, 'html.parser')

for c_s in soup.select('div.c-s'):
    for c in list(c_s.contents):
        c.find_parent('div', class_='c-w').insert_before(c)

print(soup)

Prints:

<div class="ex_example"> aa </div>
<div class="ex_example"> aa </div>
<div class="ex_example"> cc </div>
<div class="c-w">
<div class="c-s"></div>
</div>
<div class="audio">link</div>

<div class="ex_example"> xx </div>
<div class="ex_example"> yy </div>
<div class="ex_example"> zz </div>
<div class="c-w">
<div class="c-s"></div>
</div>
Related