【问题标题】:using python, Remove HTML tags/formatting from a string [duplicate]使用python,从字符串中删除HTML标签/格式[重复]
【发布时间】:2011-03-24 20:29:13
【问题描述】:

我有一个包含 html 标记(如链接、粗体文本等)的字符串。

我想去掉所有标签,所以我只有原始文本。

最好的方法是什么?正则表达式?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    使用 lxml.html。它比 BeautifulSoup 快得多,原始文本是一个命令。

    >>> import lxml.html
    >>> page = lxml.html.document_fromstring('<!DOCTYPE html>...</html>')
    >>> page.cssselect('body')[0].text_content()
    '...'
    

    【讨论】:

    • 很好的解决方案,谢谢!使用这个 sn-p 从 HTML 片段中提取文本:lxml.html.fromstring('some HTML fragment').text_content()
    • 这应该是公认的答案。使用正则表达式解析 HTML(尤其是直接来自互联网)是一个非常糟糕的想法!
    • 这只是简单地剥离所有 HTML 代码并用任何内容替换它,如果它插入适当的换行符会很好,这样你就不会得到一行废话
    【解决方案2】:

    使用SGMLParserregex 在简单的情况下工作。但是 HTML 有很多错综复杂的东西,你宁愿不必处理。

    >>> from sgmllib import SGMLParser
    >>>
    >>> class TextExtracter(SGMLParser):
    ...     def __init__(self):
    ...         self.text = []
    ...         SGMLParser.__init__(self)
    ...     def handle_data(self, data):
    ...         self.text.append(data)
    ...     def getvalue(self):
    ...         return ''.join(ex.text)
    ...
    >>> ex = TextExtracter()
    >>> ex.feed('<html>hello &gt; world</html>')
    >>> ex.getvalue()
    'hello > world'
    

    【讨论】:

    • 谢谢,一直在寻找这样一个不需要外部依赖的解决方案。将 ''.join(ex.text) 更改为 ''.join(self.text) 使其适合作为独立类。
    【解决方案3】:

    使用正则表达式的 AFAIK 是解析 HTML 的一个坏主意,你会更好 使用像 beautiful soup 这样的 HTML/XML 解析器。

    【讨论】:

    • 美汤+1
    • 我正在使用 beautifulsoup,但我也希望能够手动剥离 html 标签。谢谢!
    • @Blankman 在您的问题中提及这一点是个好主意
    • 他不是在解析 HTML,而是在删除标签。解析 HTML/XML 非常慢,通常是使用它的应用程序中最慢的方面,因此我不推荐 BeautifulSoup。 HTML解析不能用正则表达式完成,因为正则表达式没有堆栈(LIFO),而且HTML可以任意嵌套,这需要一个堆栈来解析。
    • 为什么美汤更适合html解析?我自己使用正则表达式。我错过了光明吗?谢谢。
    【解决方案4】:

    根据文本是否包含“>”或“

    def cleanStrings(self, inStr):
      a = inStr.find('<')
      b = inStr.find('>')
      if a < 0 and b < 0:
        return inStr
      return cleanString(inStr[a:b-a])
    

    【讨论】:

      【解决方案5】:

      如果你要使用正则表达式:

      import re
      def striphtml(data):
          p = re.compile(r'<.*?>')
          return p.sub('', data)
      
      >>> striphtml('<a href="foo.com" class="bar">I Want This <b>text!</b></a>')
      'I Want This text!'
      

      【讨论】:

      • 这只能在格式良好的 HTML 上可靠地工作(即,在实际标签之外没有未转义的 &lt;&gt;,没有像 &lt;b class="forgot-to-close" 这样的格式错误的标签等)。话虽如此,这是我使用的第一种方法,具体取决于源数据。
      • 请在非常有限的情况下添加更多说明,这将是一个好主意,我将删除我的反对票。谢谢。
      • 加上这也将删除以下文本 => "if 3 3"
      猜你喜欢
      • 2011-05-24
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2021-06-21
      • 2015-10-09
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多