如何在XPath表达式中使用Python变量?

时间:2016-05-19 12:31:37

标签: python xml xpath

我正在尝试从此网站https://www.quora.com/profile/Karan-Bansal-3/followers

获取所有followers name

由于整个页面没有立即加载,我每次都在循环中使用它:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

既然我不能一次选择所有元素,我试图使用索引来查找循环中的元素。

people = driver.find_element_by_xpath("//div[@class='pagedlist_item'][i]/*/div[@class='ObjectCard-header']/a[@class='user']")

在这里,您可以看到,我正在尝试使用[i]进行索引,这显然不起作用并代替它,如果我给[1]或任何数字它运作良好。那么如何逐个选择元素呢。

代码段:

i=1
target = open(filename,'w')
driver.get('https://www.quora.com/profile/Karan-Bansal-3/followers')
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
people = driver.find_element_by_xpath("//div[@class='pagedlist_item'][i]/*/div[@class='ObjectCard-header']/a[@class='user']")
target.write(people.text)
target.write("\n")
i = i+1

3 个答案:

答案 0 :(得分:2)

在托管语言中使用字符串连接,以便在构造XPath之前评估i。否则,[i]是对i元素存在的谓词测试。您没有说明您的托管语言是什么,但假设字符串连接是"string" + "string"

 "//div[@class='pagedlist_item'][" + i + "]/*/div[@class='ObjectCard-header']/a[@class='user']"

另请参阅:How to pass variable parameter into XPath expression?

更新:好的,所以你在Python中托管XPath。

如果您首先通过+i投射到字符串,则可以使用str(i)进行连接,

 "//div[@class='pagedlist_item'][" + str(i) + "]/*/div[@class='ObjectCard-header']/a[@class='user']"

或者您可以使用我提供的链接中使用的format()

 "//div[@class='pagedlist_item'][{}]/*/div[@class='ObjectCard-header']/a[@class='user']".format(i)

无论哪种方式,将上面构造的XPath表达式放入您对find_element_by_xpath()的调用中,您的问题应该得到解决。

警告 :请勿将此方法与i的不受信任的值一起使用,或者您可以将代码打开到XPath injection attacks

答案 1 :(得分:0)

解决方案是首先将索引转换为字符串。

index = str(i)
people = driver.find_element_by_xpath("//div[@class='pagedlist_item'][" + index + "]/*/div[@class='ObjectCard-header']/a[@class='user']")
i++

答案 2 :(得分:0)

首先使用str(index)将index / i变量转换为字符串,然后 尝试在下面使用:

content = rows.xpath('// div [@ class =“ LookupHelpDesc”] ['+ index +'] // text()')。extract_first()

始终使用报价。