You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动