BS4:用新标签包裹兄弟姐妹范围

时间:2019-11-08 12:13:00

标签: html beautifulsoup

我正在使用BeautifulSoup 4.8.1。

我想扩充HTML文件以突出显示感兴趣的部分。

举个例子。假设我有

<div> some preceding junk </div>
<div> BEGIN TRIGGER </div>
<div> Lorem ipsum dolor </div>
<div> sit amet, consetetur elitir </div>
<div> more clutter at the end </div>
<div> END TRIGGER </div>

我已经能够提取中间包含四个<div>标签的列表(即从'BEGIN TRIGGER'到'clutter',包括)。

我想产生以下输出:

<div> some preceding junk </div>
<p>
 <div> BEGIN TRIGGER </div>
 <div> Lorem ipsum dolor </div>
 <div> sit amet, consetetur elitir </div>
 <div> more clutter at the end </div>
</p>
<div> END TRIGGER </div>

我该如何实现?我认为,如果无法以原子方式包装整个范围,知道如何为已知的bs4.element.Tag创建新的同级结构可能会有所帮助。

1 个答案:

答案 0 :(得分:0)

根据您的示例,我尝试了此操作。希望这会有所帮助。 首先使用Regex细化要添加元素的元素,然后再find_next_siblings()进行查找,直到找到为止。

最后添加新标签

,然后在其中添加所有div标签。

import re
from bs4 import BeautifulSoup

html='''<div> some preceding junk </div>
<div> BEGIN TRIGGER </div>
<div> Lorem ipsum dolor </div>
<div> sit amet, consetetur elitir </div>
<div> more clutter at the end </div>
<div> END TRIGGER </div>'''

soup=BeautifulSoup(html,'html.parser')
search=soup.find("div",text=re.compile('BEGIN'))
prev=search.find_previous_siblings('div')[0]

new_tag = soup.new_tag("p")
new_tag.append(str(search) +'\n')
for item in search.find_next_siblings('div'):

    if 'END TRIGGER' in item.text:
       lastement=item
       break;
    else:
        new_tag.append(str(item) + '\n')

finalsoup=str(prev) +'\n' + new_tag.prettify(formatter=None) + '\n' + str(lastement)

print(finalsoup)

输出

<div> some preceding junk </div>
<p>
 <div> BEGIN TRIGGER </div>
 <div> Lorem ipsum dolor </div>
 <div> sit amet, consetetur elitir </div>
 <div> more clutter at the end </div>
</p>
<div> END TRIGGER </div>