通过Xpath在不同的子代中找到具有多个变量的元素

时间:2020-10-08 12:01:35

标签: python selenium xpath

我正在尝试根据后代的可变内容查找元素。我在这里查看了关于stackoverflow的几篇文章,但是不幸的是,无法弄清楚如何使它们适应我的情况。实际上,我试图找到以下列表元素<li>,其中包含字符串变量facility(无论在何处)和带有字符串变量lesson_time的后代div:

<div class="day">
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> 
    <a class="xy" href="...">
      <div class="abc">
        <div class="text-h4">This is the text</div>
        ...
      </div>
      ...
    </a>
  </li>
</div>

由于每个<li>可以包含一个变量,因此我需要使用AND运算符查找与两个变量匹配的元素。我设法这样搜索<li>

day_ele = driver.find_element_by_xpath("//div[@class='day'][contains(., '" + args.day + "')]")
day_ele.find_element_by_xpath(".//li[@class='btn-hover-parent'][contains(., '" + args.facility + "')][contains(., '" + args.lesson_time + "')]").click()

但是,这会在<li>的任何位置搜索变量,这对我来说是个问题。对于lesson_time,我明确希望在<div class="text-h4">中进行搜索。我尝试过这样的事情:

day_ele.find_element_by_xpath("//li[@class='btn-hover-parent'][contains(., '" + args.facility + "')] and ./div[@class='text-h4'][contains(., '" + args.lesson_time + "')]").click()

但是,这告诉我XPath表达式无效。每个搜索字词本身都有效。我认为./div做错了。我也尝试过.//divdiv,但都没有用。

如果这很重要,请使用Python 3 Selenium进行。

1 个答案:

答案 0 :(得分:0)

U可以像这样使用BeautifulSoup

from bs4 import BeautifulSoup

html = """
<div class="day">
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> ... </li>
  <li class="btn-hover-parent"> 
    <a class="xy" href="...">
      <div class="abc">
        <div class="text-h4">This is the text</div>
        ...
      </div>
      ...
    </a>
  </li>
</div>
"""
soup = BeautifulSoup(html,'html.parser')

li_items = soup.find_all('li',class_ = "btn-hover-parent")

for li in li_items:
    try:
        print(li.a.div.div.text)
    except:
        pass

输出:

This is the text

这有效。但是,如果u在具有其他值的多个div标签之间具有div标签,则将for loop更改为此:

for li in li_items:
    try:
        a = li.find('a',class_ = "xy")
        div1 = a.find('div',class_ = "abc")
        div2 = div1.find('div',class_ = "text-h4")
        print(div2.text)
    except:
        pass

输出:

This is the text

希望这会有所帮助!