【问题标题】:How to deal with single and double quotes in xpath in Python如何在Python中处理xpath中的单引号和双引号
【发布时间】:2019-08-24 16:25:24
【问题描述】:

我有一个 XPath,它在 XPath 中有一个单引号,导致 SyntaxError: error

我已经尝试过转义序列:

xpath = "//label[contains(text(),'Ayuntamiento de la Vall d'Uixó  - Festivales Musix')]"

但我仍然面临错误:

SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//label[contains(text(),'Ayuntamiento de la Vall d'Uixó - Festivales Musix')]' 不是有效的 XPath 表达式.

【问题讨论】:

    标签: python selenium selenium-webdriver xpath xpath-1.0


    【解决方案1】:

    XPath 字符串文字中没有引号转义。 (注意:此答案适用于 XPath 1.0。在更高版本的 XPath 中,此问题已得到解决 - 请参阅下面的评论。)

    在纯 XPath 中获得所需结果的唯一方法是连接交替引用的字符串。

    //label[contains(., concat('Ayuntamiento de la Vall d', "'", 'Uixó - Festivales Musix'))]
    

    您可以通过在单引号处拆分目标字符串并使用', "'" , ' 作为新分隔符再次连接部分来机械地构建这些类型的表达式。 Python 示例:

    search_value = "Ayuntamiento de la Vall d'Uixó - Festivales Musix"  # could contain both " and '
    
    xpath = "//label[contains(., %s)]" % xpath_string_escape(search_value)
    
    def xpath_string_escape(input_str):
        """ creates a concatenation of alternately-quoted strings that is always a valid XPath expression """
        parts = input_str.split("'")
        return "concat('" + "', \"'\" , '".join(parts) + "', '')"
    

    一些 XPath 库支持绑定参数(很像 SQL)来解决这个问题,但以上是唯一适用于任何地方的方法。

    【讨论】:

    • 其实在XPath 2.0及以后的版本中,就有这样的引号转义机制。 " 通过用两个相邻的引号表示来进行转义:"",转义的撇号由两个撇号表示:''。参见规则 74 至 76:w3.org/TR/xpath20/#id-literals
    • 你说得对,我为这个问题假设了 XPath 1.0。我会更新我的措辞。
    • @Tomalak 你的 sn-p 应该返回这个:return "concat('" + '\',"\'",\''.join(parts) + "', '')"
    • @Néstor 你是对的,这很无聊。现已修复,谢谢!
    【解决方案2】:

    试试下面的 xpath。

    xpath = "//label[contains(text(), \"Ayuntamiento de la Vall d'Uixó  - Festivales Musix\")]"
    

    【讨论】:

    • 当被搜索的字符串包含双引号时怎么办?当你不知道它包含什么样的引号时你会怎么做,因为字符串是因为它是一个运行时值?
    【解决方案3】:

    您可以使用三引号定义搜索字符串 - 这样您就不必担心字符串中的任何潜在特殊字符和引号。

    这是一个例子:

    xpath = """//label[contains(text(), "Ayuntamiento de la Vall d'Uixó  - Festivales Musix")]"""
    

    如果您还想在字符串中包含反斜杠,可以使用原始三引号:

    xpath = r"""raw triple quotes string allow the use of '\'"""
    

    请参阅PEP257 了解更多详情。

    【讨论】:

    • 您不需要三引号即可将单引号转换为双引号字符串。问题不是 Python 级别的语法有效性,而是 XPath 级别的语法有效性,三引号字符串不会在那里解决问题。尤其是当搜索的值是用户提供的并且可以包含单引号和双引号时。
    • 用户发布的原始 XPath 字符串由双引号和单引号组成 - 在这种情况下,三引号是解决单引号和双引号问题的解决方案。 XPath 本身的语法有效性当然是另一个问题。
    • 不,不是。它只解决了 Python 级别的问题,这还不够。同时包含双引号和单引号的 XPath 字符串仍然是非法的。
    • 想象一下 Python 代码中的这种情况。 xpath = "//label[contains(text(), '%s')]" % dynamic_value,这很可能是 OP 所拥有的。无论dynamic_value 包含什么内容,您如何防止运行时错误?
    【解决方案4】:

    要在 双引号 中构造一个 ,其中包含 Python 中带有 单引号 的文本,您可以使用以下 Locator Strategy

    xpath = "//label[text()=\"Ayuntamiento de la Vall d'Uixó  - Festivales Musix\"]"
    

    【讨论】:

    • 如果搜索字符串包含双引号怎么办?
    • 这个也可以。
    • 好的...怎么样?如果它包含两种类型的引号怎么办?问题不在于如何构造 Python 字符串,而在于如何构造 XPath 字符串。
    • @Tomalak 您能否根据您的确切要求提出一个新问题。 StackOverflow 贡献者将很乐意为您提供帮助。
    • 我没有要求。我在问,因为你的答案在 OP 问题的上下文中不起作用。它在技术上是正确的,但在实践中没有用。
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 2020-04-09
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2012-04-07
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多