首页 > 解决方案 > Selenium 使用 xpath 在已获取的 WebElement 中查找子元素始终返回整个页面上的第一个匹配项

问题描述

我正在使用 selenium 和 python 来测试一个网站,我正在尝试获取网站上文件的链接,如下所示:divs = find_elements_by_css_selector("div.answer")用于获取页面上的帖子,这很好。divs[i].find_element_by_xpath("//figure/a[1]").get_attribute("href)在最后一次提取的每个结果元素上使用。我正在处理的网站具有以下结构:

<html>
<div class="answer">
<blockquote class="message">
<figure class="thumb">
<a href="cdn.xyz.net/img1.jpg">
<img class="file-data" src="cdn.xyz.net/img1.jpg">
</a>
</figure>
</blockquote>
</div>
...... More identical divs with different thumbnails
</html>

这里的问题是,在divs[i].find_element_by_xpath("//figure/a[1]").get_attribute("href")循环的每次迭代中,该行总是返回站点上所有 div 的第一个 url,在这种情况下cdn.xyz.net/img1.jpg,这不是我想要做的事情,因为我想获得链接每个 div。我重现此问题的代码是这样的:

try:
    elements = driver.find_elements_by_css_selector('div.answer')
    for el in elements: #For every reply
        embedLink = el.find_element_by_xpath("//figure[1]/a[1]")
        print("Found embed link: " + embedLink.get_attribute("href")) #this returns the first link every time
except:
    print("error")

我在这里做错了什么?

标签: pythonhtmlseleniumxpath

解决方案


xapth正在从根元素搜索,除非您告诉它从当前上下文开始使用.//

el.find_element_by_xpath('.//figure[1]/a[1]')

您还可以使用完整xpath来定位元素

elements = driver.find_elements_by_xpath('//div[@class="answer"]//figure[1]/a[1]')
for el in elements: #For every reply
    print('Found embed link: ' + el.get_attribute('href'))

推荐阅读