【问题标题】:Stripping HTML tags form string keeping/removing the text in between剥离 HTML 标记形式的字符串保留/删除其间的文本
【发布时间】:2016-10-18 04:01:05
【问题描述】:

我想在 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>

我想做的是删除跨度标签,将跨度标签之间的文本保留为“插入”类,并删除跨度标签“删除线”之间的文本。

我发现这是为了去除标签之间的文本:

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()

但如果标签具有特殊类(“删除线”),我想删除跨度标签之间的文本。

我该怎么做?

【问题讨论】:

  • 对于正则表达式来说似乎很简单。你试过吗?

标签: python python-3.x text-processing


【解决方案1】:

你几乎是对的。 您只需要使用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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多