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 "<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 Jalapeñ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 "Jalapeño".'
>>>
>>> t = 'The prompt is >>>'
>>> 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 å·²ç»�å¸®ä½ è‡ªåŠ¨å¤„ç�†äº†ç›¸å…³çš„æ›¿æ�¢ç»†èŠ‚ã€‚