使用python,从字符串中删除HTML标签/格式[重复]

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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"

以上是关于使用python,从字符串中删除HTML标签/格式[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python/BeautifulSoup - 如何从元素中删除所有标签?

从 Python 字符串中删除不在允许列表中的 HTML 标记

如何从输出中删除 html 标签但保持格式

使用 python 和 lxml 模块从 html 中删除所有 javascript 标签和样式标签

在python中使用正则表达式从文本中删除html标签

使用 Python 和 Regex,如何从 html 中删除 <sup> 标签? [复制]