如何使用 XPath 查找标题中包含单引号和双引号的元素?
How can I use XPath to find an element with a title that contains single and double quotes?
我有一些 Python/Selenium 代码使用 XPath 查找具有指定标题文本的元素:
tab_element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//a[@title="' + tab_title + '"]'))
在大多数情况下它工作正常,但当它遇到标题包含双引号的元素时会失败。
<p title="that'll be the "dayg"">That'll be the "day"</p>
所以,我有两个问题:
如何让它与包含双引号的标题值一起使用?
如何让它与任何标题值一起使用,例如同时包含双引号和单引号的标题值?
我最终使用了来自 的 Elias 的 XPath 转义函数。
def escape_string_for_xpath(s):
if '"' in s and "'" in s:
return 'concat(%s)' % ", '\"',".join('"%s"' % x for x in s.split('"'))
elif '"' in s:
return "'%s'" % s
return '"%s"' % s
escaped_title = escape_string_for_xpath('"that\'ll be the "day"')
driver.find_element_by_xpath('//a[@title=' + escaped_title + ']')
对于 XPath 1.0,规则是:
(a) 字符串文字不能包含用作字符串分隔符的标记;唯一的解决方法是使用 concat() 形成字符串,例如 concat("'", '"', "'")
是三个字符的字符串 '"'
.
(b) 如果字符串文字包含在宿主语言中具有特殊含义的字符(例如 Java 中的 "
或 XML 中的 &
),则它需要使用宿主语言转义约定(Java中的\"
,XML中的&
)进行转义。
在 XPath 2.0 中,您可以通过加倍绕过 (a):例如,""""
是一个字符串文字,表示包含双引号字符的长度为 1 的字符串。您还可以使用 codepoints-to-string()
函数绕过 (a) 和 (b)。
我有一些 Python/Selenium 代码使用 XPath 查找具有指定标题文本的元素:
tab_element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//a[@title="' + tab_title + '"]'))
在大多数情况下它工作正常,但当它遇到标题包含双引号的元素时会失败。
<p title="that'll be the "dayg"">That'll be the "day"</p>
所以,我有两个问题:
如何让它与包含双引号的标题值一起使用?
如何让它与任何标题值一起使用,例如同时包含双引号和单引号的标题值?
我最终使用了来自
def escape_string_for_xpath(s):
if '"' in s and "'" in s:
return 'concat(%s)' % ", '\"',".join('"%s"' % x for x in s.split('"'))
elif '"' in s:
return "'%s'" % s
return '"%s"' % s
escaped_title = escape_string_for_xpath('"that\'ll be the "day"')
driver.find_element_by_xpath('//a[@title=' + escaped_title + ']')
对于 XPath 1.0,规则是:
(a) 字符串文字不能包含用作字符串分隔符的标记;唯一的解决方法是使用 concat() 形成字符串,例如 concat("'", '"', "'")
是三个字符的字符串 '"'
.
(b) 如果字符串文字包含在宿主语言中具有特殊含义的字符(例如 Java 中的 "
或 XML 中的 &
),则它需要使用宿主语言转义约定(Java中的\"
,XML中的&
)进行转义。
在 XPath 2.0 中,您可以通过加倍绕过 (a):例如,""""
是一个字符串文字,表示包含双引号字符的长度为 1 的字符串。您还可以使用 codepoints-to-string()
函数绕过 (a) 和 (b)。