用包含相同文本的子标签替换beautifulsoup标签的标记文本的一种优雅方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用包含相同文本的子标签替换beautifulsoup标签的标记文本的一种优雅方法相关的知识,希望对你有一定的参考价值。
所以我有如下所示的这些标签,在某些情况下包含其他标签(在这些情况下为跨度)
<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{218}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="font-weight:bold">Test1###yrdy</span></p>,
<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{220}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test2###qweqwe</p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{22}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="color:red">Test3</span> ###qweqeqwe</p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{17}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test4 ### sfsfsdfds</p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{19}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test5### 121212</p>
[我正在尝试找出一种方法,用一个包含替换文本的范围来替换###和###之后的内容我正在查看.replace_with()方法,但这将完全替换标记]
对.string使用上面的命令不能像我的字符串那样工作
Test1###yrdy
Test2###qweqwe
None
Test4 ### sfsfsdfds
Test5### 121212
因此第3行将丢失。我也尝试更改.contents 对于段落中的p:
print(p.contents)
for content in p.contents:
if "###" in content:
content=content.replace("###",'<span>'+'###'+'</span>')
print (p.contents)
以上对树没有任何影响
所需的结果(文本将以某种样式包含在其自己的范围内:]
<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{218}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="font-weight:bold">Test1<span>###yrdy</span></span></p>,
<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{220}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test2<span>###qweqwe</span></p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{22}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="color:red">Test3</span> <span>###qweqeqwe</span></p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{17}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test4 <span>### sfsfsdfds</span></p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{19}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test5<span>### 121212</span></p>
答案
txt = '''<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{218}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="font-weight:bold">Test1###yrdy</span></p>,
<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{220}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test2###qweqwe</p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{22}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="color:red">Test3</span> ###qweqeqwe</p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{17}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test4 ### sfsfsdfds</p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{19}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test5### 121212</p>'''
soup = BeautifulSoup(txt, 'html.parser')
r = re.compile(r'(.*?)(###.*)')
for tag in soup.find_all(lambda tag: any('###' in c for c in tag.contents)):
# find content index:
for idx, c in enumerate(tag.contents):
if '###' in c:
break
tag.contents[idx] = BeautifulSoup(r.sub(r'1<span>2</span>', tag.contents[idx]), 'html.parser')
print(soup)
打印:
<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{218}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="font-weight:bold">Test1<span>###yrdy</span></span></p>,
<p id="p:{659babcd-9de3-0e7a-27ba-7fa0325a40f7}{220}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test2<span>###qweqwe</span></p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{22}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt"><span style="color:red">Test3</span> <span>###qweqeqwe</span></p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{17}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test4 <span>### sfsfsdfds</span></p>,
<p id="p:{d59b11dc-654f-0d5c-0ee2-f66181a6fa4b}{19}" lang="en-US" style="font-size:10.5pt;margin-top:0pt;margin-bottom:0pt">Test5<span>### 121212</span></p>
以上是关于用包含相同文本的子标签替换beautifulsoup标签的标记文本的一种优雅方法的主要内容,如果未能解决你的问题,请参考以下文章