Python-CookBook:36、在文本中处理 HTML 和 XML 实体

本贴最后更新于 1702 天前,其中的信息可能已经沧海桑田

 问题

我们想将&entity 或&#code 这样的 HTML 或 XML 实体替换为它们相对应的文本。或者,我们需要生成文本,但是要对特定的字符(比如 <,> 或&)做转义处理。

 解决方案

如果要生成文本,使用 html.escape()函数来完成替换这样的特殊字符相对来说是比较容易的。例如:

>>> s = 'Elements are written as "<tag>text</tag>".'
>>> import html
>>> print(s)
Elements are written as "<tag>text</tag>".
>>> print(html.escape(s))
Elements are written as "<tag>text</tag>".

>>> # Disable escaping of quotes
>>> print(html.escape(s, quote=False))
Elements are written as "<tag>text</tag>".
>>>

如果要生成 ASCII 文本,并且想针对非 ASCII 字符将它们对应的字符编码实体嵌入到文本中,可以在各种同 I/O 相关的函数中使用 errors='xmlcharrefreplace'参数来实现。示例如下:

>>> s = 'Spicy Jalapen~o'
>>> s.encode('ascii', errors='xmlcharrefreplace')
b'Spicy Jalape&#241;o'
>>>

要替换文本中的实体,那就需要不同的方法。如果实际上是在处理 HTML 或 XML,首先应该尝试使用一个合适的 HTML 或 XML 解析器。一般来说,这些工具在解析的过程中会自动处理相关值的替换,而我们完全无需为此操心。

如果由于某种原因在得到的文本中带有一些实体,而我们想手工将它们替换掉,通常可以利用各种 HTML 或 XML 解析器自带的功能函数和方法来完成。示例如下:

>>> s = 'Spicy "Jalapeño&quot.'
>>> from html.parser import HTMLParser
>>> p = HTMLParser()
>>> p.unescape(s)
'Spicy "Jalapen~o".'
>>>

>>> t = 'The prompt is >>>'
>>> from xml.sax.saxutils import unescape
>>> unescape(t)
'The prompt is >>>'
>>>

 讨论

在生成 HTML 或 XML 文档时,适当地对特殊字符做转义处理常常是个容易被忽视的细节。尤其是当自己用 print()或其他一些基本的字符串格式化函数来产生这类输出时更是如此。简单的解决方案是使用像 html.escape()这样的工具函数。

如果需要反过来处理文本(即,将 HTML 或 XML 实体转换成对应的字符),有许多像 xml.sax.saxutils.unescape()这样的工具函数能帮上忙。但是,我们需要仔细考察一个合适的解析器应该如何使用。例如,如果是处理 HTML 或 XML,像 html.parser 或 xml.etree.ElementTree 这样的解析模块应该已经解决了有关替换文本中实体的细节问题。

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    535 引用 • 672 回帖 • 1 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...