如何删除特定html标签内的所有内容(以及标签本身)

时间:2018-06-27 11:07:00

标签: python html tags

假设您有以下字符串:

text = """<p>Bla bla bla.</p><p>Blo blo blo<a 
href="http://www.example.com">bli bli</a>.</p><p>blu blu<br>
<span style="font-size: x-small;"><br>
content to remove</span></p>"""

我的目标是删除<span style="font-size: x-small;"><br>content to remove</span>中的所有内容以及开始和结束标签。

因此,如果属性样式为"font-size: x-small;",我只能删除范围标记(及其内容)。

我的代码不起作用。在这里:

import re    
pattern = re.compile(r"\<span style='font-size: x-small;'\>.*?\</span\>")
new_text = pattern.sub(lambda match: match.group(0).replace(match.group(0),'') ,text) 

我宁愿使用Python本身,因为我对正则表达式一无所知(如您所见...)。但是如果要使用正则表达式,我会接受的。

3 个答案:

答案 0 :(得分:1)

您可以使用find,索引和字符串连接。

new_text = text[:text.find("<span")]+text[text.find("</span>")+7:]

text.find("</span>")+7查找首次出现的索引,然后在该索引上加上标记本身的长度7。

有很多方法可以解决这个问题。对于任何非平凡的html解析,我建议使用Beautifulsoup

答案 1 :(得分:1)

我找到了美丽汤的方法:

from bs4 import BeautifulSoup

soup = BeautifulSoup(text, 'html.parser')
spans_to_delete = soup.find_all('span', style=lambda value: value and 'font-size: x-small' in value)

if spans_to_delete:
    for span in spans_to_delete:
        span.extract()

    new_text = str(soup)
else:
    print('No span with desired style found')

实际上this主题的第一个答案给了我指导。

答案 2 :(得分:0)

我会使用正则表达式。

正则表达式\<span(.*)span>匹配span标记内的所有内容,包括开始和结束标记。试试这个:

    String text = "<p>Bla bla bla.</p><p>Blo blo blo<a 
    href=\"http://www.example.com\">bli bli</a>.</p><p>blu blu<br><span 
    style=\"font-size: x-small;\"><br>content to remove</span></p>";
    text = text.replaceAll("\\<span(.*)span>", "");