如何通过 div class 排除所有带有 td class 的元素
How to find element by div class excluding all with td class
我正在使用 Xpath 并尝试查找所有具有 div class 名称 'day' 的 td,但不包括具有 [=55] td class 名称的所有 td =].
这是一个使用 selenium Xpath 的日历,select 仅匹配 div class 'day' 在 selected 月份。忽略上个月或未来一个月的任何 div class 'day'。
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
None 然而已经成功地过滤掉那些 td 为 td class='invalid_day'
尝试过的代码:
.find_elements_by_xpath('//td[./div[@class="day"]]')
Returns:
29,30,31,1,2,3,...31,1
尝试过的代码:
.find_elements_by_xpath('//td[./div[@class="day"] and not[@class="invalid_day"]]')
Returns:
空
还尝试了 css_selector 方法:
.find_elements_by_css_selector('.day:not(.invalid_day)')
Returns:
29,30,31,1,2,3,...31,1
我要找的结果:
1,2,3,...31
提前致谢!
你可以试试这个。
driver.find_elements_by_css_selector("td:not(.invalid_day)>div.day")
希望对您有所帮助。
下面的 XPath-1.0 表达式应该可以完成这项工作:
.find_elements_by_xpath('//div[@class="day" and not(../@class="invalid_day")]')
输出为:
1,2,3
要获取 <td>
元素,只需将 /..
附加到 XPath 或使用以下表达式:
.find_elements_by_xpath('//td[./div/@class="day" and not(@class="invalid_day")]')
查找所有带有 class 作为 day
的 <div>
标签,不包括父 <td>
带有 classinvalid_day
即 1,2,3,...31,您可以使用以下任一项 xpath based :
xpath 1: 忽略父元素 class invalid_day
//td[not(@class='invalid_day')]//div[@class='day']
快照:
xpath 2:忽略具有任何父元素的元素 class
//td[not(@class)]//div[@class='day']
快照:
参考
您可以在以下位置找到一些相关讨论:
你可以用 bs4 来做。
from bs4 import BeautifulSoup
import requests
response = requests.get(URL)
soup = BeautifulSoup(response.text, "lxml")
divs = soup.findAll("div", class_ = "day")
然后为了仅获取文本,您可以为列表中的每个项目执行 .text。
我正在使用 Xpath 并尝试查找所有具有 div class 名称 'day' 的 td,但不包括具有 [=55] td class 名称的所有 td =].
这是一个使用 selenium Xpath 的日历,select 仅匹配 div class 'day' 在 selected 月份。忽略上个月或未来一个月的任何 div class 'day'。
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
None 然而已经成功地过滤掉那些 td 为 td class='invalid_day'
尝试过的代码:
.find_elements_by_xpath('//td[./div[@class="day"]]')
Returns: 29,30,31,1,2,3,...31,1
尝试过的代码:
.find_elements_by_xpath('//td[./div[@class="day"] and not[@class="invalid_day"]]')
Returns: 空
还尝试了 css_selector 方法:
.find_elements_by_css_selector('.day:not(.invalid_day)')
Returns: 29,30,31,1,2,3,...31,1
我要找的结果: 1,2,3,...31
提前致谢!
你可以试试这个。
driver.find_elements_by_css_selector("td:not(.invalid_day)>div.day")
希望对您有所帮助。
下面的 XPath-1.0 表达式应该可以完成这项工作:
.find_elements_by_xpath('//div[@class="day" and not(../@class="invalid_day")]')
输出为:
1,2,3
要获取 <td>
元素,只需将 /..
附加到 XPath 或使用以下表达式:
.find_elements_by_xpath('//td[./div/@class="day" and not(@class="invalid_day")]')
查找所有带有 class 作为 day
的 <div>
标签,不包括父 <td>
带有 classinvalid_day
即 1,2,3,...31,您可以使用以下任一项 xpath based
xpath 1: 忽略父元素 class
invalid_day
//td[not(@class='invalid_day')]//div[@class='day']
快照:
xpath 2:忽略具有任何父元素的元素 class
//td[not(@class)]//div[@class='day']
快照:
参考
您可以在以下位置找到一些相关讨论:
你可以用 bs4 来做。
from bs4 import BeautifulSoup
import requests
response = requests.get(URL)
soup = BeautifulSoup(response.text, "lxml")
divs = soup.findAll("div", class_ = "day")
然后为了仅获取文本,您可以为列表中的每个项目执行 .text。