2.17 在字符串中处�html和xml¶

问题¶

你想将HTML或者XML实体如 &entity; 或 &#code; 替�为对应的文本。 �者,你需�转�文本中特定的字符(比如<, >, 或 &)。

解决方案¶

如果你想替�文本字符串中的 ‘<’ 或者 ‘>’ ,使用 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 &quot;&lt;tag&gt;text&lt;/tag&gt;&quot;.

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

如果你正在处�的是ASCII文本,并且想将�ASCII文本对应的编�实体嵌入进去, �以给�些I/O函数传递�数 errors='xmlcharrefreplace' �达到这个目。比如:

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

为了替�文本中的编�实体,你需�使用�外一�方法。 如果你正在处�HTML或者XML文本,试�先使用一个�适的HTML或者XML解�器。 通常情况下,这些工具会自动替�这些编�值,你无需担心。

有时候,如果你接收到了一些�有编�值的原始文本,需�手动去�替�, 通常你�需�使用HTML或者XML解�器的一些相关工具函数/方法��。比如:

>>> s = 'Spicy &quot;Jalape&#241;o&quot.'
>>> from html.parser import HTMLParser
>>> p = HTMLParser()
>>> p.unescape(s)
'Spicy "Jalapeño".'
>>>
>>> t = 'The prompt is &gt;&gt;&gt;'
>>> from xml.sax.saxutils import unescape
>>> unescape(t)
'The prompt is >>>'
>>>

讨论¶

在生�HTML或者XML文本的时候,如果正确的转�特殊标记字符是一个很容易被忽视的细节。 特别是当你使用 print() 函数或者其他字符串格�化�产生输出的时候。 使用� html.escape() 的工具函数�以很容易的解决这类问题。

如果你想以其他方�处�文本,还有一些其他的工具函数比如 xml.sax.saxutils.unescapge() �以帮助你。 然而,你应该先调研清楚怎样使用一个�适的解�器。 比如,如果你在处�HTML或XML文本, 使用�个解�模�比如 html.parse 或 xml.etree.ElementTree 已�帮你自动处�了相关的替�细节。