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

时间:2017-08-28 04:35:04

标签: python django

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

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

问题解释了这一切。

我要编写一个python函数,它将HTML字符串作为输入,以及要剥离的标记列表,(模仿Django模板' s removetags功能,因为它已被弃用)

最简单的方法是什么?
由于列出的原因,以下方法对我没有用处:

  • 使用正则表达式(原因为obvious

  • Clean() method by Bleach library令人惊讶的是,这样一个强大的库对此要求毫无用处,因为它遵循 白名单优先方法,而问题是黑名单优先。     漂白剂只对保持'有用。某些标签,但不是 删除某些(除非你准备维护一个巨大的列表 可能ALLOWED_TAGS

  • lxml.html.Cleaner() remove_tagskill_tags相结合这有点接近我的目标,但它会 领先并且做(除去)比它应该的更多,并且那里 没有办法控制最好的行为,比如请求 Cleaner()保留邪恶的<script>标签。

  • BeautifulSoup 即可。这有一个名为clear()的方法来删除指定的标记,但它只删除标记的内容 需要剥离标签,但要保留内容。

2 个答案:

答案 0 :(得分:1)

美味的汤有unwrap()

  

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

您必须手动迭代要替换的所有标记。

答案 1 :(得分:1)

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

使用given link中提供的示例,我会将其修改为剥离 trait Encoder[Z] { type Out def apply(z: Z): Out } object Encoder { type Aux[Z, Out0] = Encoder[Z] { type Out = Out0 } // implicits } trait Deriver[A] object Deriver { // implicits } def derive[A, I <: HList, R <: HList, Z <: HList](a: A, i: I)(implicit gen: Generic.Aux[A, R], zipper: Zip.Aux[R :: I :: HNil, Z], enc: Lazy[Encoder.Aux[Z, Deriver[A]]]): Deriver[A] = { val genRepr: R = gen.to(a) val zipped: Z = zipper(genRepr :: i :: HNil) enc.value(zipped) } case class Foo(a: String, b: String, c: String) // derive[Foo, Nat._1 :: Nat._3 :: Nat._7 :: HNil, ???, ???] derive(Foo("aaa", "bbb", "ccc"), Nat._1 :: Nat._3 :: Nat._7 :: HNil) 代码但保留其数据:

<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 列表以用于剥离这些标记。