【发布时间】:2011-03-24 20:29:13
【问题描述】:
我有一个包含 html 标记(如链接、粗体文本等)的字符串。
我想去掉所有标签,所以我只有原始文本。
最好的方法是什么?正则表达式?
【问题讨论】:
我有一个包含 html 标记(如链接、粗体文本等)的字符串。
我想去掉所有标签,所以我只有原始文本。
最好的方法是什么?正则表达式?
【问题讨论】:
使用 lxml.html。它比 BeautifulSoup 快得多,原始文本是一个命令。
>>> import lxml.html
>>> page = lxml.html.document_fromstring('<!DOCTYPE html>...</html>')
>>> page.cssselect('body')[0].text_content()
'...'
【讨论】:
lxml.html.fromstring('some HTML fragment').text_content()
使用SGMLParser。 regex 在简单的情况下工作。但是 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 > world</html>')
>>> ex.getvalue()
'hello > world'
【讨论】:
使用正则表达式的 AFAIK 是解析 HTML 的一个坏主意,你会更好 使用像 beautiful soup 这样的 HTML/XML 解析器。
【讨论】:
根据文本是否包含“>”或“
def cleanStrings(self, inStr):
a = inStr.find('<')
b = inStr.find('>')
if a < 0 and b < 0:
return inStr
return cleanString(inStr[a:b-a])
【讨论】:
如果你要使用正则表达式:
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!'
【讨论】:
< 或 >,没有像 <b class="forgot-to-close" 这样的格式错误的标签等)。话虽如此,这是我使用的第一种方法,具体取决于源数据。