【问题标题】:How to remove everything inside a specific html tag (along with the tag itself)如何删除特定 html 标签内的所有内容(连同标签本身)
【发布时间】:2018-12-06 06:10:25
【问题描述】:

假设你有这个字符串:

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>"""

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

所以如果属性样式是"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 本身,因为我对正则表达式一无所知(如您所见......)。但如果正则表达式是要走的路,我会接受。

【问题讨论】:

    标签: python html tags


    【解决方案1】:

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

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

    text.find("&lt;/span&gt;")+7 查找 的第一次出现的索引,然后将 7 添加到该索引,即标记本身的长度。

    有很多方法可以解决这个问题。对于任何重要的 html 解析,我推荐Beautifulsoup。

    【讨论】:

    • 它可以工作,但如果style="font-size: x-small;",我只能删除跨度标签(及其内容)。我猜你的代码会删除所有 span 标签内容,这对我没有好处。
    • 仅第一次出现。请参阅查找文档。您可以使用样式标签扩展 find 子句。
    • 我看到了文档,但我找不到删除所有跨度标签(连同内容)when style="font-size: x-small;" 的方法
    【解决方案2】:

    我会使用正则表达式。

    正则表达式 \&lt;span(.*)span&gt; 匹配 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>", "");
    

    【讨论】:

    • OP 专门要求避免使用正则表达式
    • 不,他没有。他只是说他更喜欢 python,但他会考虑一个正则表达式的解决方案。
    • 正如我之前所说,如果 style="font-size: x-small;",我只能删除 span 标签(及其内容)。我猜您的代码会删除所有跨度标签内容,这对我没有好处。但是,是的,我会考虑 regex 或者 beautifulsoup。
    【解决方案3】:

    我找到了一种使用 Beautiful Soup 的方法:

    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线程的第一个回答给了我方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 2021-10-09
      • 2012-09-24
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      相关资源
      最近更新 更多