Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 在使用find_元素声明变量后查找xpath同级_Python 2.7_Xpath_Selenium Chromedriver - Fatal编程技术网

Python 2.7 在使用find_元素声明变量后查找xpath同级

Python 2.7 在使用find_元素声明变量后查找xpath同级,python-2.7,xpath,selenium-chromedriver,Python 2.7,Xpath,Selenium Chromedriver,首先,我尝试通过使用.find\u elements\u by\u xpath选择站点上的所有菜单项来查找它们。这个很好用 (按钮为文本或图像) 然后我想循环遍历这些元素中的每一个,返回标记之间的文本,或者返回span标记图像的src,span标记位于标记之前,中间有文本 返回文本工作正常,但我无法返回src。我在构建源自循环当前迭代的xpath时遇到了问题。剩下的不是“无法定位”,就是我一遍又一遍地返回第一个菜单图像 以下是我当前正在运行的代码(请注意,我无法给出该站点的URL): 因此,我比

首先,我尝试通过使用.find\u elements\u by\u xpath选择站点上的所有菜单项来查找它们。这个很好用

(按钮为文本或图像)

然后我想循环遍历这些元素中的每一个,返回标记之间的文本,或者返回span标记图像的src,span标记位于标记之前,中间有文本

返回文本工作正常,但我无法返回src。我在构建源自循环当前迭代的xpath时遇到了问题。剩下的不是“无法定位”,就是我一遍又一遍地返回第一个菜单图像

以下是我当前正在运行的代码(请注意,我无法给出该站点的URL):

因此,我比较有信心“span[@class…”后面的代码可以正常工作,问题是前面的代码

我希望有一个简单的解决方案,并且我在编写xpath时犯了一个错误,但我现在完全没有想法

编辑:

下面是我正在处理的基本html结构

<td class="ThemeOfficeMainItem" onmouseover="ItemMouseOverOpenSub ()">
    <span class="ThemeOfficeMainFolderLeft">
        <img src="img1.png"></span>
    <span class="ThemeOfficeMainFolderText">TEXT</span>
    <span class="ThemeOfficeMainFolderRight">&nbsp;</span>
</td>
<td class="ThemeOfficeMainItem" onmouseover="ItemMouseOverOpenSub ()">
    <span class="ThemeOfficeMainFolderLeft">
        <img src="img2.png"></span>
    <span class="ThemeOfficeMainFolderText"></span>
    <span class="ThemeOfficeMainFolderRight">&nbsp;</span>
</td>

正文

如果要从先前定义的父元素
菜单部分开始搜索
span
,则应使用

./span[@class="ThemeOfficeMainFolderText"]/preceding-sibling::span/img
注意
XPath
开头的点,它指向当前(
menu\u part
)元素

更新

至于代码的逻辑,请尝试以下操作:

browser = webdriver.Chrome()
browser.get(URL)
menu = browser.find_elements_by_xpath('//td[@onmouseover]')
for menu_part in menu:
    text_span = menu_part.find_element_by_xpath('./span[@class="ThemeOfficeMainFolderText"]')
    if not text_span.text:
        menu_button = menu_part.find_element_by_xpath('./span[@class="ThemeOfficeMainFolderText"]/preceding-sibling::span/img').get_attribute('src')
    else:
        menu_button = text_span.text
    print menu_button

你能为同样的内容添加html吗?我试过这样做,但它只是返回“找不到”Ok,所以我很困惑,但是如果我使用menu[x](因此它将如下所示:menu[x]。find_元素…)我想我可以使用enumerate将元素在列表中的位置设为x,但我不明白为什么不能简单地使用menu\u part仍然存在同样的问题……老实说,我现在更困惑了。如果我在菜单列表中传递一个显式位置,那么它就可以工作了(即menu[1].find_元素…->返回列表中的第二个图像).但是,当我传递一个变量时,比如每次循环迭代增加一个x,我就收到一个错误,内容无法定位。这怎么可能呢?实际上我不知道,因为我的代码在您提供的
HTML
示例中按预期工作…您的示例
HTML
可能与实际
HT不同ML
或者您错误地实现了我的代码我为占用了您这么多的时间而感到难过!我在创建答案时删除了一些代码,我才意识到它正跳过了那些本来可以找到图像的迭代。代码的两个部分没有真正的关联,所以我以前不想检查。总之,谢谢你的帮助!
./span[@class="ThemeOfficeMainFolderText"]/preceding-sibling::span/img
browser = webdriver.Chrome()
browser.get(URL)
menu = browser.find_elements_by_xpath('//td[@onmouseover]')
for menu_part in menu:
    text_span = menu_part.find_element_by_xpath('./span[@class="ThemeOfficeMainFolderText"]')
    if not text_span.text:
        menu_button = menu_part.find_element_by_xpath('./span[@class="ThemeOfficeMainFolderText"]/preceding-sibling::span/img').get_attribute('src')
    else:
        menu_button = text_span.text
    print menu_button