我想在python 3中清理一些html,其中我使用了一些span标记来标记带有颜色和删除删除文本的插入文本。一个例子:
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore
magna aliquyam erat, sed diam voluptua. <span class="inserted">
Lorem ipsum</span> Lorem ipsum dolor sit amet, consetetur
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum.
<span class="strikethrough">Lorem ipsum</span> lorem
<span class="inserted">ipsum</span>. At vero eos et accusam et
justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
我想要做的是删除span标签,将文本保留在span标签和'inserted'类之间,并删除span标签'strikethrough'之间的文本。
我发现这样可以剥离标记,使文本保持在:
之间from html.parser import HTMLParser
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.strict = False
self.convert_charrefs= True
self.fed = []
def handle_data(self, d):
self.fed.append(d)
def get_data(self):
return ''.join(self.fed)
def strip_tags(html):
s = MLStripper()
s.feed(html)
return s.get_data()
但是如果标签有一个特殊的类('删除线'),我想删除span标签之间的文本。
我该怎么做?
答案 0 :(得分:0)
你几乎是对的。
您只需使用handle_starttag()
和handle_endtag()
方法以及一些变量来跟踪当前状态。
这个怎么样:
from html.parser import HTMLParser
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.strict = False
self.convert_charrefs = True
self._forbidden = False
self._result = []
def handle_starttag(self, tag, attrs):
if tag in ['span']:
if 'strikethrough' in [a for _, a in attrs]:
self._forbidden = True
def handle_endtag(self, tag):
self._forbidden = False
def handle_data(self, data):
if not self._forbidden:
self._result.append(data)
st = MLStripper()
st.feed('''
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore
magna aliquyam erat, sed diam voluptua. <span class="inserted">
Lorem ipsum</span> Lorem ipsum dolor sit amet, consetetur
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum.
<span class="strikethrough">Lorem ipsum</span> lorem
<span class="inserted">ipsum</span>. At vero eos et accusam et
justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
''')
print(''.join(st._result))
结果:
Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore
magna aliquyam erat, sed diam voluptua.
Lorem ipsum Lorem ipsum dolor sit amet, consetetur
sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
labore et dolore magna aliquyam erat, sed diam voluptua. At
vero eos et accusam et justo duo dolores et ea rebum.
lorem
ipsum. At vero eos et accusam et
justo duo dolores et ea rebum. Stet clita kasd gubergren,
no sea takimata sanctus est Lorem ipsum dolor sit amet.