从字符串中删除 HTML 标签的 Python 代码

新手上路,请多包涵

我有这样一段文字:

 text = """<div>
<h1>Title</h1>
<p>A long text........ </p>
<a href=""> a link </a>
</div>"""

使用纯 Python,没有外部模块我想要这个:

 >>> print remove_tags(text)
Title A long text..... a link

我知道我可以使用 lxml.html.fromstring(text).text_content() 来做到这一点,但我需要在纯 Python 中使用 2.6+ 的内置或标准库来实现相同的目的

我怎样才能做到这一点?

原文由 Bruno Rocha - rochacbruno 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 517
1 个回答

使用正则表达式

使用正则表达式,您可以清除内部的所有内容 <>

 import re
# as per recommendation from @freylis, compile once only
CLEANR = re.compile('<.*?>')

def cleanhtml(raw_html):
  cleantext = re.sub(CLEANR, '', raw_html)
  return cleantext

某些 HTML 文本还可以包含未括在方括号中的实体,例如“ &nsbm ”。如果是这种情况,那么您可能希望将正则表达式编写为

CLEANR = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});')

链接 包含有关此的更多详细信息。

使用 BeautifulSoup

您还可以使用 BeautifulSoup 附加包来查找所有原始文本。

您将需要在调用 BeautifulSoup 时显式设置解析器我推荐 "lxml" 如替代答案中所述(比默认的更强大( html.parser )(即无需额外安装即可使用)。

 from bs4 import BeautifulSoup
cleantext = BeautifulSoup(raw_html, "lxml").text

但是并不妨碍你使用外部库,所以我推荐第一种方案。

编辑:要使用 lxml 你需要 pip install lxml

原文由 c24b 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题