问题
我们想将&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ño'
>>>
要替换文本中的实体,那就需要不同的方法。如果实际上是在处理 HTML 或 XML,首先应该尝试使用一个合适的 HTML 或 XML 解析器。一般来说,这些工具在解析的过程中会自动处理相关值的替换,而我们完全无需为此操心。
如果由于某种原因在得到的文本中带有一些实体,而我们想手工将它们替换掉,通常可以利用各种 HTML 或 XML 解析器自带的功能函数和方法来完成。示例如下:
>>> s = 'Spicy "Jalapeño".'
>>> 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 这样的解析模块应该已经解决了有关替换文本中实体的细节问题。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于