2012-09-16 57 views
2

我試圖用Selenium和xpaths來獲取一些數據。Selenium的Xpath嵌套括號問題(使用Python)

以下XPath正常工作:

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

,並返回4匹配的URL。到現在爲止還挺好。

問題是我想編寫一個xpath來單獨定位每個URL。

使用Firefox的XPath檢查插件,我已成功地證實,下面的代碼不正是我需要的:

((//*[@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檢查器那樣的嵌套括號?

任何想法,將最讚賞,因爲我一直工作在這幾個小時,似乎無法使它工作:(

+0

啊:(我如何可能會通過其他方式解決我的問題嗎?如果我運行打印sel.get_attribute(「XPath的=(// * [@ ID = 'course_list']/* [@類的任何想法='series'])[4] // * [@ class ='series_links'] // a/@ href「)它只打印一個結果,儘管xpath匹配4個不​​同的URL。 – Jonathan

+0

@MartijnPieters,不,這是一個語法正確的XPath 1.0表達式 –

+0

@DimitreNovatchev:好吧,錯誤的猜測然後 –

回答

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. 
+0

感謝您的回覆!我是否需要使用webdriver才能正常工作?目前我認爲我只是使用RC('from selenium import selenium')當我嘗試運行你的代碼時,我得到:'NameError:global name'driver'is not defined' – Jonathan

+0

是的,這是一個webdriver函數,我將編輯帖子至incl進口和東西,以充分發揮作用。 – kreativitea

0

不是一個真正的回答我的問題,但我沒有找到一個解決辦法對於那些可能會遇到類似問題的人來說,如果你指定了一個不正確的XPath(或者不存在的),那麼該命令將簡單地返回一個0('0 ')

所以我現在使用一個簡單的'if'語句來驗證xpath是否存在,然後運行get_attr ibute命令:

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")