Search code examples
pythonseleniumxpathcalendarcss-selectors

How to find element by div class excluding all with td class


I'm using Xpath and trying to find all td's with a div class name of 'day' excluding those with a td class name of 'invalid_day'.

This is for a calendar using selenium Xpath to select only the matching div class 'day' in the selected month. Ignoring any div class 'day' from the previous or future month.

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>

After searching the forum I have tried quite few approaches and all get the td's with div class='day'.
None however have been successful in filtering out those td's with a td class='invalid_day'

Code tried:

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

Returns: 29,30,31,1,2,3,...31,1

Code tried:

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

Returns: empty

Also tried the css_selector method with:

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

Returns: 29,30,31,1,2,3,...31,1

Results I am looking for: 1,2,3,...31

Thanks in advance!


Solution

  • You can try this:

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