繁体   English   中英

如何使用Python从html字符串中剥离(不删除)指定的标签?

[英]How to strip(not remove) specified tags from a html string using Python?

使用Python从HTML字符串中剥离(不删除)指定标签的正确方法。

def strip_tags(html, tags=[]):
    ....
    pass #return the html string by stripping the tags from the list

这些问题说明了一切。

我要编写一个将HTML字符串作为输入以及要剥离的标签列表的python函数,(不建议使用Django模板的removetags功能)

最简单的方法是什么?
由于所列原因,以下方法对我不起作用:

  • 使用正则表达式(出于明显的原因)

  • Bleach库的Clean()方法 令人惊讶的是,这种健壮的库对于此要求毫无用处,因为它遵循白名单优先方法,而问题是黑名单优先方法。 Bleach仅对“保留”某些标签有用,而对于删除某些标签无用(除非您准备维护所有可能的ALLOWED_TAGS的庞大列表)

  • lxml.html.Cleaner()remove_tagskill_tags结合使用这与我在寻找的内容有些接近,但是它进行得比预期的要多,并且无法执行的操作也无法控制。最好的,例如请求Cleaner()保留邪恶的<script>标签。

  • 美丽的汤 它有一个称为clear()的方法来删除指定的标签,但是它删除了标签的内容,而我只需要剥离标签但保留内容。

美丽的汤具有unwrap()

它用标签内的任何内容替换标签。

您将必须手动遍历要替换的所有标签。

您可以扩展Python的HTMLParser并创建自己的解析器以跳过指定的标签。

使用给定链接中提供的示例,我将其修改为去除<h1></h1>标签,但保留其数据:

from html.parser import HTMLParser

NOT_ALLOWED_TAGS = ['h1']

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag not in NOT_ALLOWED_TAGS:
            print("Encountered a start tag:", tag)

    def handle_endtag(self, tag):
        if tag not in NOT_ALLOWED_TAGS:
            print("Encountered an end tag :", tag)

    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

那将返回:

Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data  : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body 
# h1 start tag here
Encountered some data  : Parse me!
# h1 close tag here
Encountered an end tag : body
Encountered an end tag : html

现在,您可以维护一个NOT_ALLOWED_TAG列表,以剥离这些标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM