我想使用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与数字标签放在一起。
答案 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>