[英]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_tags
或kill_tags
结合使用这与我在寻找的内容有些接近,但是它进行得比预期的要多,并且无法执行的操作也无法控制。最好的,例如请求Cleaner()保留邪恶的<script>
标签。
您可以扩展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.