从字符串中剥离HTML标记保留/删除中间的文本

2024-04-26 21:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想清理一下python3中的一些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标记,保留类“inserted”的span标记之间的文本,并删除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标记有一个特殊的类('strikethrough'),我想删除span标记之间的文本。你知道吗

我该怎么做?你知道吗


Tags: 标记文本selfdefhtmlsedclasset
1条回答
网友
1楼 · 发布于 2024-04-26 21:18:44

你几乎是对的。 您只需要使用^{}^{}方法和一些变量来跟踪当前状态。你知道吗

这个怎么样:

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.

相关问题 更多 >