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

标签 python html xml string parsing

我有这样的文字:

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+ 的内置或 std 库来实现相同的目标

我该怎么做?

最佳答案

使用正则表达式

使用正则表达式,您可以清理 <> 中的所有内容:

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});')

这个 link包含有关此的更多详细信息。

使用 BeautifulSoup

您也可以使用 BeautifulSoup额外的包来找出所有的原始文本。

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

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

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

编辑:使用 lxml您需要 pip install lxml .

关于从字符串中删除 HTML 标记的 Python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662346/

相关文章:

java - Apache Camel XmlJsonDataFormat XML 到 JSON

python - 如何使用正则表达式(TextFSM 模板)单独匹配单行 CLI 输出 (LLDP) 的三个独立部分

python - 删除重复行?

html - Zurb Foundation 顶部栏下拉菜单和菜单不起作用

html - 如何将面具跨过 table

xml - 如何使用 Nant 的 xmlpoke 目标删除节点

c++ - 从 xsd 生成 xml 文件的工具(用于测试)

python - 模块未找到错误 : No module named 'requests_kerberos'

c# - 如何双重解码 UTF-8 字节 C#

jquery - 如何更改 PhoneGap 应用程序中的背景图像?