如何将字符串传递给xpath?

时间:2018-08-13 16:20:14

标签: python string xpath

我有以下格式的xpath

xpath='//*[@id="peoplegrid"]/div[5]/div[1]/a'

我想通过以下方式将字符串传递给x路径中的第一个div

x=[1,2,3,4,5]
for i in x:
    xpath='//*[@id="peoplegrid"]/div[',+str(i),']/div[1]/a'
    print(xpath)

但是当我运行它时,它指出bad operand type for unary +: 'str'

如何将字符串传递给此xpath

以下是我正在研究的完整代码

x=[1,2,3,4]
for i in x:
    python_button=driver.find_element_by_xpath('//*[@id="peoplegrid"]/div,'+[str(x)]+'/div[1]/a')
    python_button.click()
    driver.execute_script("window.history.go(-1)")

3 个答案:

答案 0 :(得分:2)

您缺少第二个SortedList。尝试这样的事情。

+

答案 1 :(得分:1)

我无法通过如此细微的更改(少于6个字符)来更新@Steven的答案,所以我创建了自己的答案。

您需要的是以下内容:

xpath='//*[@id="peoplegrid"]/div['+str(i)+']/div[1]/a'

您可以说,在我的答案和@Steven的答案之间,我的逗号不在XPATH的前div部分中。为了您的目的,将逗号放在字符串中是不必要且无效的。 print语句中通常使用逗号,以防止将换行符附加到输出中。

编辑:关于对原始帖子及其中注释的更改,将列表连接到字符串也是无效的。仅使用解释器并尝试编译代码,就会抛出TypeError: must be str, not list。这是有道理的,因为您不能将list直接附加到str上;但是,如果list的内容是字符串,或者可以转换为字符串,则可以将它们串联起来。有关Python中字符串连接的说明,请参见here

答案 2 :(得分:1)

最好避免通过字符串连接构造XPath表达式。缺点:

(a)您需要担心转义包含特殊字符的字符串

(b)如果人们可能有恶意插入坏字符串(XPath注入攻击)的可能性,您就必须真正担心它

(c)您必须在每次使用表达式时对其进行编译。

我不知道您正在使用的Python API,但是大多数XPath API允许您编译包含变量的表达式(例如'//[@id="peoplegrid"]/div[$param]/div[1]/a'),然后将值分别绑定到变量。如果可以做到这一点,那就更可取了,并且可以避免上述缺点。