使用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_tags
或kill_tags
相结合这有点接近我的目标,但它会
领先并且做(除去)比它应该的更多,并且那里
没有办法控制最好的行为,比如请求
Cleaner()保留邪恶的<script>
标签。
BeautifulSoup 即可。这有一个名为clear()的方法来删除指定的标记,但它只删除标记的内容 需要剥离标签,但要保留内容。
答案 0 :(得分:1)
答案 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
列表以用于剥离这些标记。