如何用美丽的汤包裹相邻的标签

时间:2017-07-10 09:58:33

标签: python beautifulsoup

我想使用beautifulsoup做以下但我不知道如何。
有一个如下的html文件。

<img src="00001.jp">
<figcaption>caption string1</figcaption>

<img src="00002.jp">

<img src="00003.jp">
<figcaption>caption string3</figcaption>

我想将此html转换如下。

<figure>
  <img src="00001.jp">
  <figcaption>caption string1</figcaption>
</figure>

<figure>
  <img src="00002.jp">
</figure>

<figure>
  <img src="00003.jp">
  <figcaption>caption string3</figcaption>
</figure>

如果img标签的下一个是figcaption标签,请将其与图形标签放在一起。 如果它不同,我想只附上带有数字标签的img标签。
我知道可以使用带有以下代码的图形标记仅包含img标记。

from bs4 import BeautifulSoup

html = "<img src="00001.jp">
<figcaption>caption string1</figcaption>

<img src="00002.jp">

<img src="00003.jp">
<figcaption>caption string3</figcaption>"

content = BeautifulSoup(html)

for img_tag in content.find_all('img'):
  img_tag.wrap(content.new_tag('figure'))

但是,我不知道如何检测下一个标签是figcaption标签 另外,我不知道是否将img标签和figcaption与数字标签放在一起。

1 个答案:

答案 0 :(得分:2)

没有办法在一行中完成,但你可以通过一些小改动来做到这一点:

for img_tag in content.find_all('img'):          
    fig = content.new_tag('figure')
    img_tag.wrap(fig)

    next_node = img_tag.find_next() 
    if next_node and next_node.name == 'figcaption':        
        fig.append(next_node)

print(content)

您需要首先创建figure标记并保留对它的引用,然后包装image标记。之后,使用img_tag.find_next()获取下一个兄弟,并检查它是否为figcaption标记。如果是,请将该标记附加为figure标记的子标记。

有助于理解所有更改都已到位。

此代码将给出:

<figure>
   <img src="00001.jp"/>
   <figcaption>caption string1</figcaption>
</figure>
<figure><img src="00002.jp"/></figure>
<figure>
   <img src="00003.jp"/>
   <figcaption>caption string3</figcaption>
</figure>