我正在使用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创建新的同级结构可能会有所帮助。
答案 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>