mba*_*hau 68
像这样的东西?
>>> from xml.sax.saxutils import escape
>>> escape("< & >")
'< & >'
Run Code Online (Sandbox Code Playgroud)
And*_*ikh 12
你的意思是你做这样的事情:
from xml.dom.minidom import Text, Element
t = Text()
e = Element('p')
t.data = '<bar><a/><baz spam="eggs"> & blabla &entity;</>'
e.appendChild(t)
Run Code Online (Sandbox Code Playgroud)
然后你将得到很好的转义XML字符串:
>>> e.toxml()
'<p><bar><a/><baz spam="eggs"> & blabla &entity;</></p>'
Run Code Online (Sandbox Code Playgroud)
K L*_*K L 12
xml.sax.saxutils.escape只有逃跑&,<和>默认,但它确实提供了一个entities参数,还逃避其他字符串:
from xml.sax.saxutils import escape
def xmlescape(data):
return escape(data, entities={
"'": "'",
"\"": """
})
Run Code Online (Sandbox Code Playgroud)
xml.sax.saxutils.escape在str.replace()内部使用,因此您也可以跳过导入并编写自己的函数,如MichealMoser的答案所示.
Mic*_*ser 11
xml.sax.saxutils不会转义引号字符(")
所以这是另一个:
def escape( str ):
str = str.replace("&", "&")
str = str.replace("<", "<")
str = str.replace(">", ">")
str = str.replace("\"", """)
return str
Run Code Online (Sandbox Code Playgroud)
如果查找它,那么xml.sax.saxutils只会进行字符串替换
use*_*028 11
安德烈·弗拉索夫斯基赫接受的答案是对OP最完整的答案。但这个主题出现在最频繁的搜索中,python escape xml我想对本文中讨论的三种解决方案进行时间比较,并提供我们选择部署的第四个选项,因为它提供了增强的性能。
所有四个都依赖于本机 python 数据处理或 python 标准库。这些解决方案按性能从最慢到最快的顺序提供。
\n选项 1 - 正则表达式
\n该解决方案使用 python 正则表达式库。它产生最慢的性能:
\nimport re\ntable = {\n "<": "<",\n ">": ">",\n "&": "&",\n "'": "'",\n '"': """,\n}\npat = re.compile("({})".format("|".join(table)))\n\ndef xmlesc(txt):\n return pat.sub(lambda match: table[match.group(0)], txt)\n\n>>> %timeit xmlesc('<&>"\\'')\n1.48 \xc2\xb5s \xc2\xb1 1.73 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n仅供参考:\xc2\xb5s 是微秒的符号,是百万分之一秒。另一种实现的完成时间以纳秒 (ns) 为单位,即十亿分之一秒。
\n选项 2 -- xml.sax.saxutils
\n该解决方案使用 pythonxml.sax.saxutils库。
from xml.sax.saxutils import escape\ndef xmlesc(txt):\n return escape(txt, entities={"'": "'", '"': """})\n\n>>> %timeit xmlesc('<&>"\\'')\n832 ns \xc2\xb1 4.3 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n选项 3 - str.replace
\n该解决方案使用字符串replace()方法。在底层,它实现了与 python 类似的逻辑xml.sax.saxutils。saxutils 代码有一个 for 循环,会消耗一些性能,使这个版本稍微快一些。
def xmlesc(txt):\n txt = txt.replace("&", "&")\n txt = txt.replace("<", "<")\n txt = txt.replace(">", ">")\n txt = txt.replace('"', """)\n txt = txt.replace("'", "'")\n return txt\n\n>>> %timeit xmlesc('<&>"\\'')\n503 ns \xc2\xb1 0.725 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n选项 4 - str.translate
\n这是最快的实施。它使用字符串translate()方法。
table = str.maketrans({\n "<": "<",\n ">": ">",\n "&": "&",\n "'": "'",\n '"': """,\n})\ndef xmlesc(txt):\n return txt.translate(table)\n\n>>> %timeit xmlesc('<&>"\\'')\n352 ns \xc2\xb1 0.177 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
27339 次 |
| 最近记录: |