【问题标题】:How to find element by div class excluding all with td class如何通过 div 类查找元素,不包括 td 类的所有元素
【发布时间】:2020-11-05 08:10:39
【问题描述】:

我正在使用 Xpath 并尝试查找所有 div 类名为“day”的 td,不包括 td 类名为“invalid_day”的那些。

这适用于使用 selenium Xpath 仅选择所选月份中匹配的 div 类“日”的日历。忽略上个月或未来月份的任何 div 类“日”。

HTML

<tbody>
  <tr>
    <td class="invalid_day">
      <div class="day">29</div>
    <td class="invalid_day">
      <div class="day">30</div>
    <td class="invalid_day">
      <div class="day">31</div>
    <td>
      <div class="day">1</div>
    <td>
      <div class="day">2</div>
    <td>
      <div class="day">3</div>
    <td>
      <div class="day">4</div>
  </tr>
  <tr>
  #removed <td> 5 - 31 for brevity
    <td class="invalid_day">
      <div class="day">1</div>
  </tr>

在搜索论坛后,我尝试了很多方法,都得到了 div class='day' 的 td。
然而,没有一个成功地过滤掉那些带有 td class='invalid_day'

的 td

尝试过的代码:

.find_elements_by_xpath('//td[./div[@class="day"]]')

返回: 29,30,31,1,2,3,...31,1

尝试过的代码:

.find_elements_by_xpath('//td[./div[@class="day"] and not[@class="invalid_day"]]')

返回: 空的

还尝试了 css_selector 方法:

.find_elements_by_css_selector('.day:not(.invalid_day)')

返回: 29,30,31,1,2,3,...31,1

我正在寻找的结果: 1,2,3,...31

提前致谢!

【问题讨论】:

    标签: python selenium xpath calendar css-selectors


    【解决方案1】:

    要查找所有带有 classday&lt;div&gt; 标记,不包括带有 classinvalid_day 的父 &lt;td&gt; 的标记,即 1, 2,3,...31,您可以使用以下任一 基于Locator Strategies

    • xpath 1:忽略父类invalid_day的元素

      //td[not(@class='invalid_day')]//div[@class='day']
      

    快照:

    • xpath 2:忽略任何父类的元素

      //td[not(@class)]//div[@class='day']
      

    快照:


    参考

    您可以在以下位置找到一些相关讨论:

    【讨论】:

      【解决方案2】:

      你可以用 bs4 做到这一点。

      from bs4 import BeautifulSoup
      import requests
      
      response = requests.get(URL)
      soup = BeautifulSoup(response.text, "lxml")
      
      divs = soup.findAll("div", class_ = "day")
      

      然后要仅获取文本,您可以为列表中的每个项目执行 .text。

      【讨论】:

        【解决方案3】:

        以下 XPath-1.0 表达式应该可以完成这项工作:

        .find_elements_by_xpath('//div[@class="day" and not(../@class="invalid_day")]')
        

        输出是:

        1,2,3

        要获取 &lt;td&gt; 元素,您可以简单地将 /.. 附加到 XPath 或使用以下表达式:

        .find_elements_by_xpath('//td[./div/@class="day" and not(@class="invalid_day")]')
        

        【讨论】:

          【解决方案4】:

          你可以试试这个。

          driver.find_elements_by_css_selector("td:not(.invalid_day)>div.day")
          

          希望对你有帮助。

          【讨论】:

          • 非常感谢,这行得通!在尝试 Xpath 之前,最初的尝试是 css_selector。
          猜你喜欢
          • 2017-08-08
          • 2014-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 1970-01-01
          • 2013-08-06
          相关资源
          最近更新 更多