• 2.17 在字符串中处理html和xml
    • 问题
    • 解决方案
    • 讨论

    2.17 在字符串中处理html和xml

    问题

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

    解决方案

    如果你想替换文本字符串中的 ‘<’ 或者 ‘>’ ,使用 html.escape() 函数可以很容易的完成。比如:

    1. >>> s = 'Elements are written as "<tag>text</tag>".'
    2. >>> import html
    3. >>> print(s)
    4. Elements are written as "<tag>text</tag>".
    5. >>> print(html.escape(s))
    6. Elements are written as &quot;&lt;tag&gt;text&lt;/tag&gt;&quot;.
    7.  
    8. >>> # Disable escaping of quotes
    9. >>> print(html.escape(s, quote=False))
    10. Elements are written as "&lt;tag&gt;text&lt;/tag&gt;".
    11. >>>

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

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

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

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

    1. >>> s = 'Spicy &quot;Jalape&#241;o&quot.'
    2. >>> from html.parser import HTMLParser
    3. >>> p = HTMLParser()
    4. >>> p.unescape(s)
    5. 'Spicy "Jalapeño".'
    6. >>>
    7. >>> t = 'The prompt is &gt;&gt;&gt;'
    8. >>> from xml.sax.saxutils import unescape
    9. >>> unescape(t)
    10. 'The prompt is >>>'
    11. >>>

    讨论

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

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

    原文:

    http://python3-cookbook.readthedocs.io/zh_CN/latest/c02/p17_handle_html_xml_in_text.html