用包含相同文本的子标签替换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标签的标记文本的一种优雅方法的主要内容,如果未能解决你的问题,请参考以下文章

Seaborn:如何在条形图中用 X 轴中的文本替换索引?

替换数据库文本字段中所有出现的子字符串

用其他列值pyspark替换包含美元符号($)的子字符串[重复]

REGEXP_REPLACE 用相同的小写文本替换文本

自动单击包含相同文本和标签的页面上的多个按钮

用 PhpWord 中的格式替换文本中的 html 标签