Selenium的Xpath嵌套括号问题(使用Python)

时间:2012-09-16 13:08:34

标签: python xpath selenium

我正在尝试使用Selenium和xpaths获取一些数据。

以下xpath工作正常:

print sel.get_attribute("xpath=(//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a/@href")

并返回4个匹配的网址。到目前为止一切都很好。

问题是我想编写一个xpath来单独定位每个URL。

使用Firefox xpath checker插件,我设法确认以下代码完全符合我的要求:

((//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a/@href)[1]

但是尽管在Firefox xpath检查器中工作,我似乎无法在Selenium中使用它。

每当我尝试执行时:

print sel.get_attribute("xpath=((//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a/@href)[1]")

我收到以下错误:

Exception: ERROR: Invalid xpath [2]: ((//*[@id='course_list']/*[@class='series'])[4]//*[@class='series_links']//a

不确定这里发生了什么。我犯了一个简单的错误,或者Selenium xpath不支持像FF xpath检查程序那样的嵌套括号吗?

任何想法都会受到最高的赞赏,因为我一直在努力工作几个小时,似乎无法使它发挥作用:(

2 个答案:

答案 0 :(得分:1)

这也不是你问题的答案。但是,我从不使用像这样的xpath。如果网页编写者足够聪明地使用类,他也足够聪明,能够改变网页的结构并保留这些类。

from selenium import webdriver
driver = webdriver.Chrome() 

series = driver.find_element_by_class_name("series")
series_links = [i.get_attribute('href') for i in series.find_elements_by_class_name("series_links")]

driver.quit() # call this when you're done using the webdriver.

答案 1 :(得分:0)

不是我的问题的答案,但我找到了可能遇到类似问题的人的解决方法。

Selenium的get_xpath_count命令允许相对无痛的xpath验证。如果指定了不正确的xpath(或者不存在的xpath),该命令将只返回零('0')。

所以我现在使用一个简单的'if'语句在运行get_attribute命令之前验证xpath是否存在:

if sel.get_xpath_count("(//*[@class='series_links'])[" + str(data) + "]//*[@class='youtube']") > 0:
    print sel.get_attribute("xpath=(//*[@id='course_list']/*[@class='series'])[" + str(data) +"]//*[@class='youtube']//a/@href")