Python中如何转义字符串以用作XPath查询键?
解决XPath查询中含单引号字符串的转义问题
这个问题的核心是XPath的字符串转义规则和Python的转义规则不一样,你用反斜杠\转义单引号的方式在XPath里是不生效的,所以才会触发KeyError。
正确的转义方式
XPath规定:如果用单引号'包裹字符串,那么字符串内部的单引号需要用**两个连续的单引号''**来转义,而不是反斜杠。所以你只需要把替换逻辑改成这样:
player = "Ba'g" # 把单引号替换成两个单引号 xpathstring = "./note/[@player='{}']".format(player.replace("'", "''")) p = xmltree.find(xpathstring)
这样生成的XPath字符串会是./note/[@player='Ba''g'],这符合XPath的语法规范,就能正确匹配到对应的节点了。
另一种可选方案:用双引号包裹属性值
如果你觉得两个单引号看起来有点奇怪,也可以用双引号"来包裹XPath里的属性值,这样内部的单引号就不需要转义了:
player = "Ba'g" # 用双引号括住player的值,注意Python字符串用单引号包裹避免转义 xpathstring = './note/[@player="{}"]'.format(player) p = xmltree.find(xpathstring)
这种方式生成的XPath是./note/[@player="Ba'g"],同样能正常工作。不过要注意,如果你的player字符串里包含双引号,那这种方法就需要转义双引号了,所以第一种用两个单引号的方式通用性更强。
为什么原来的方法不行?
你之前用player.replace("'","\'")生成的是Ba\'g,但XPath并不识别反斜杠作为转义符,它会把\'当成普通的字符处理,所以XPath引擎会去找player属性值等于Ba\'g的节点,自然找不到,就抛出了KeyError。
内容的提问来源于stack exchange,提问作者Jos S




