2

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

以下 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 检查器那样的嵌套括号?

任何想法都将不胜感激,因为我已经为此工作了几个小时,但似乎无法使其发挥作用:(

4

2 回答 2

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.
于 2012-09-17T14:24:36.540 回答
0

不是我的问题的真正答案,但我确实为那些可能遇到类似问题的人找到了解决方法。

Selenium 的 get_xpath_count 命令允许相对轻松的 xpath 验证。如果您指定了不正确的 xpath(或不存在的 xpath),该命令将简单地返回一个零 ('0')。

所以我现在在运行 get_attribute 命令之前使用一个简单的“if”语句来验证 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")
于 2012-09-17T07:47:00.427 回答