万一出现1个以上的子标签,如何在子标签后向右移动子标签?

问题描述

我正在尝试将每个<div class="c-s">的所有子标签移到其母标签<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>
</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')

我的预期输出是以下BeautifulSoup对象

<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>

这意味着<div class="ex_example"> cc </div>的级别与<div class="c-w">相同。

非常感谢您的帮助!

解决方法

该脚本会将所有带有class="ex_example"的标签移动到父<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)

打印:

<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>