首页 > 解决方案 > 如果出现超过 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">

非常感谢你的帮助!

标签: python-3.xbeautifulsoup

解决方案


此脚本将class="ex_example"在 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)

印刷:

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

推荐阅读