【问题标题】:Locate an element based on another element xpath根据另一个元素 xpath 定位一个元素
【发布时间】:2019-11-03 13:15:39
【问题描述】:

我正在尝试使用 selenium 和 webdriver 自动化流程。

html 看起来像这样:

<span class="contract-item">
    <span class="contract-label">
        <span class="contract-name">Jimmy</span>
    </span>
    <div class="current-stats">
        <span class="info"></span>

我面临的问题是有很多“合同项”和“信息”类。我只想查找特定“合同名称”的信息。但是,通过找到“合同名称”,我丢失了信息。如何获取特定名称的“信息”?

到目前为止我有这个。

team_name = self.driver.find_elements_by_xpath("//*[contains(text(), {})]".format(jimmy))[1]

非常感谢!

【问题讨论】:

  • 考虑重新命名。您希望找到包含文本的 元素(不是“shell”)(无论您是如何通过 HTML 获得的——无论是否被抓取),都无关紧要。
  • @PartialOrder 我有一个元素,要获得我正在寻找的元素,我需要获得我拥有的那个元素的外壳。
  • 是的。明白了。元素可以嵌套。
  • 您的html无效;第一个 spandiv 没有结束标签。你能解决它吗?

标签: python python-3.x selenium selenium-webdriver web-scraping


【解决方案1】:

下面是必需的xpath:

//*[@class='合同项'和 包含(.,'Jimmy')]/div/span[@class='info']

您只需将联系人姓名字符串(即Jimmy)更改为所需的,您将获得相应的信息。

【讨论】:

    【解决方案2】:

    你需要先获取包含名字的元素,你做对了

    //*[contains(text(), "{}")]
    

    然后你需要去 info 元素和你找到的元素之间最近的公共父级,每个/.. 将在 HTML 树中向上移动一个元素。

    //*[contains(text(), "{}")]/../..
    

    最后,找到正确的按类过滤的元素

    //*[contains(text(), "{}")]/../..//span[@class="info"]//text()
    

    所以,你的表达应该是:

    team_name = self.driver.find_elements_by_xpath('//*[contains(text(), "{}")]/../..//span[@class="info"]//text()'.format('jimmy'))[1]
    

    【讨论】:

    • 谢谢!这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2022-10-14
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2020-06-11
    相关资源
    最近更新 更多