Python的正则表达式,以删除所有不在两个其他标签之间的标签

问题描述:

我正在使用python,并希望从字符串中删除所有不包含在特定标签中的html标签。在这个例子中,我想删除所有未包含在<header>标签</header>中的html标签,也不删除该标签。Python的正则表达式,以删除所有不在两个其他标签之间的标签

例如:

<h1>Morning</h1> 
<header> 
    <h1>Afternoon</h1> 
    <h2>Evening</h2> 
</header> 
<h2>Night</h2> 

结果:

Morning 
<header> 
    <h1>Afternoon</h1> 
    <h2>Evening</h2> 
</header> 
Night 

我已经花了,但没有运气小时。 我知道下面会发现所有标签:

re.sub('<.*?>', '', mystring) 

,这将找到标题标签内的任何东西:

re.sub('<header>.*?</header>', '', mystring) 

但我怎么否定它,从而使第一正则表达式忽略了什么第二个正则表达式发现?任何帮助是极大的赞赏!谢谢! :)

+7

不要使用正则表达式来处理HTML(https://*.com/questions/701166/can-you-provide-some-examples-的 - 为什么 - 这 - 是 - 难以解析的XML和HTML的-与-A-REG)。学习如何使用Beautifulsoup,让你的生活更轻松。 –

+0

我使用它来处理非常特定格式的HTML文档(每个文档都是完全相同的格式,并且对写入的内容有许多严格的规则),所以在标签等内部不会有任何这些通用html标签。我需要这个尽快完成,所以我现在没有时间,但是肯定会学到在不久的将来使用Beautifulsoup! – cullan

+1

@cullan我真的很推荐BS4。所需要的只是一个快速的“点安装beautifulsoup4”,然后在我的答案中运行代码。 :) –

您可以使用BeautifulSoup快速且轻松地完成此任务,正如Josep Valls在评论中所述。具体方法如下:

from bs4 import BeautifulSoup 

soup = BeautifulSoup('''<h1>Morning</h1> 
<header> 
    <h1>Afternoon</h1> 
    <h2>Evening</h2> 
</header> 
<h2>Night</h2>''', 'html.parser') 

for tag in soup.find_all(recursive=False): 
    if not tag.findChildren(): 
     tag.unwrap() 

print(soup) 

此打印出:

Morning 
<header> 
<h1>Afternoon</h1> 
<h2>Evening</h2> 
</header> 
Night 
+0

嘿COLDSPEED,谢谢你的所有帮助,但你能修改你的答案来帮助我修改我的问题吗?非常感谢:) – cullan

+0

@cullan我很乐意提供帮助,但修改问题并完全重置上下文不是一个好主意,对未来的读者无益。你能否提出一个新的问题? –

+0

@cullan复制您当前的问题,然后回滚您的更改。然后,发布一个新问题。 –